您的位置:首页 > 移动开发 > 微信开发

android微信支付集成步骤

2017-06-13 12:02 316 查看

android微信支付集成步骤

微信支付的集成要比集成支付宝支付稍麻烦些,由于微信官方文档有些地方说的比较含糊,容易让人在理解上产生
歧义!下面说说我的集成步骤


说下注意事项:

1.首先确定后台已经申请过微信支付,(这个过程是需要审核的)!我当时在做的时候,
ios和后台先调的,半天调试不同,最后后台一看,申请的是公众号支付,因此又重新申请,等了三四天


官方文档 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

一、需要登录微信支付商户平台,填写应用签名以及包名(文档中写有在哪里找到)

解释:ios的不需要,所以一般后台是不知道这个需要填写!我们需要跟他们要账户密码,根据文档步骤
并把包名和签名填写!
此签名不是我们应用的keystore。需要下载文档中的签名工具!链接在文档中有,下载之后
我们需要填写应用的包名,点击确定。生成一个md5的签名! https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/ sdk/Gen_Signature_Android.apk(下载签名工具的地址)
注意!!! 在网上搜索有的人说,只有正式包才能支付成功。我自己试了试,微信支付debug包也可以支付成功的
关键就在于这个生成的签名!如果用正式包生成的这个md5签名,并填写到商户平台中


二、注册微信

添加依赖
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
注册微信  在Application下注册
final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
msgApi.registerApp(微信appId);//跟后台要   是这种样式的:wxecf9a6cc08a8e149
在清单文件中注册
因为是单独唤起的一个界面 所以我这里引用的样式 是透明的。这是我自己加的,自行处理(完全可以不加)
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent"

4000
android:launchMode="singleTop">


三、回到我们的java代码中处理

这是我们后台返给我的数据格式:格式可参考
{
"data": {
"orderStr": {
"appid": "wxecf9a6cc08a85555",
"noncestr": "bKcKEk80bSA999up",
"package": "Sign=WXPay",
"partnerid": "1461203333",
"prepayid": "wx20170609154741756b95857e0147555555",
"timestamp": 1496995555
}
},
"message": "请求成功",
"status": 1
}


1)

现在oncrete里面初始化  跟application下注册的不一样

IWXAPI api  = WXAPIFactory.createWXAPI(this,微信appId);

/**
* 解析微信
*
* @param body 后台返回来的数据
*/
private void parsJsonWeiXin(String body) {
Gson gson = new Gson();
WeiXinBean weiXinBean = gson.fromJson(body, WeiXinBean.class);//根据上面的格式生成的javabean
if (weiXinBean.status == 1) {

PayReq req = new PayReq();

req.appId = weiXinBean.data.orderStr.appid;//拼接加密
req.partnerId = weiXinBean.data.orderStr.partnerid;//拼接加密
req.prepayId = weiXinBean.data.orderStr.prepayid;//拼接加密
req.nonceStr = weiXinBean.data.orderStr.noncestr;//拼接加密
req.timeStamp = weiXinBean.data.orderStr.timestamp;//拼接加密
req.packageValue = weiXinBean.data.orderStr.packageX;//不需要
//这个签名是需要我们二次加密的  把上面写有拼接加密的  需要用md5加密后生成  req.sign
req.sign = signNum(weiXinBean.data.orderStr.partnerid,
weiXinBean.data.orderStr.prepayid,
weiXinBean.data.orderStr.packageX, weiXinBean.data.orderStr.noncestr,
weiXinBean.data.orderStr.timestamp);

api.sendReq(req);
finish();
}

}


2)签名的方法(固定格式,无需做处理!把下面替换成自己的微信key)

/**
* 微信  二次签名  拼接是需要首字母按照A-Z的ascii码来拼接(md5加密工具类加密的时候,
* 重新从A-Z排序,不按顺序应该也没问题,我没有试!(你可以试试)先还是按我下面这个排序的来拼接吧
* )
*/
private String signNum(String partnerId, String prepayId, String packageValue, String nonceStr, String timeStamp) {
String stringA =
"appid=" + "wxecf9a6cc08a81e49"
+ "&noncestr=" + nonceStr
+ "&package=" + packageValue
+ "&partnerid=" + partnerId
+ "&prepayid=" + prepayId
+ "×tamp=" + timeStamp;

//微信key  格式这这样的 abcdl562asjlfd452dkadf1asdldfpd4
//微信key的路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
String stringSignTemp = stringA + "&key=" + 换成你自己的微信key;

return MD5.getMessageDigest(stringSignTemp.getBytes()).toUpperCase();
}


3)Md5 的工具类(copy的微信Demo里面的)

public class MD5 {

private MD5() {}

public  static String getMessageDigest(byte[] buffer) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(buffer);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
}


4)最后一步

记得我们在清单文件中注册的WXPayEntryActivity了吧!那个就是回调
在WXPayEntryActivity的onResp方法去做一些处理
//在详细看看官方文档怎么处理的   我这里只是简单处理
@Override
public void onResp(BaseResp resp) {

if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == 0) {

ToastUtils.show(WXPayEntryActivity.this,"支付成功");
} else {

ToastUtils.show(WXPayEntryActivity.this,"支付失败");
}
}
}


如理顺利的话就可以成功唤起,支付失败就看看错误码,挨个排除

我说说我遇到的坑

在微信商户里面签名写的是正式包生成的签名,我直接运行,因为是debug包所以支付失败
我又生成正式包,还是失败,最后把微信卸载掉,重装好了。微信是有缓存的
如果日后在商户平台的签名改了(正式包签名换debug,或debug换正式)
首先打成相应的包,其次还需要把微信卸掉重装
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: