微信支付
三方支付在安卓开发中应用广泛,在做微信支付之前我也查了很多资料,查看博客,发现大家写的都不是很详细,也可以理解为每个人遇到的难点不同所以解释问题的侧重点不同。作为菜鸟,我把自己成功集成微信支付的过程代码写下了,既是总结,也是分享经验。BB了这么多就开始吧。
1.创建应用
2.集成支付
- 1.导入libammsdk.jar包
- 2.添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 3.
<activity
android:name="net.sourceforge.simcpux.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
注意:上述声明的activity(WXPayEntryActivity)不在jar包中,所以我们需要从demo
中拷贝WXPayEntryActivity.java文件放到我们工程中,包名要保持不变。
3.调用微信支付
/**
* 微信支付
*
* @param view
*/
public void wxpay(View view) {
IWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, true);
PayReq payReq = new PayReq();
//1.官方网站申请到的合法appId
payReq.appId = Constants.APP_ID;
//2.微信支付分配商户号
payReq.partnerId = Constants.WEIXIN_MCH_ID;
//3.微信返回的支付交易会话ID,由后台处理
//"prepay_id": "wx20170529105445617b34d3fd0731390820",
payReq.prepayId = "wx20170529105445617b34d3fd0731390820";
//4.时间戳,需转换为秒
payReq.timeStamp = "" + (System.currentTimeMillis() / 1000);
//5.拓展字段, 官网说是暂填写固定值Sign=WXPay, 但是Demo中是这样写的"prepay_id=" + prepayId;。[Demo中的不对]
payReq.packageValue = "Sign=WXPay";
//6.
payReq.nonceStr = genNonceStr();
//7.
payReq.sign = getWeiXinPaySign(payReq);
//8.
boolean b = api.sendReq(payReq);
if (!b) {
Intent i = new Intent(this, WXPayEntryActivity.class);
i.putExtra("message", "未安装微信客户端");
startActivity(i);
}
}
private String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}
private String getWeiXinPaySign(PayReq payReq) {
if (null == payReq) {
return null;
}
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
if (!TextUtils.isEmpty(payReq.appId)) {
signParams.add(new BasicNameValuePair("appid", payReq.appId));
}
if (!TextUtils.isEmpty(payReq.extData)) {
signParams.add(new BasicNameValuePair("extdata", payReq.extData));
}
if (!TextUtils.isEmpty(payReq.nonceStr)) {
signParams.add(new BasicNameValuePair("noncestr", payReq.nonceStr));
}
if (!TextUtils.isEmpty(payReq.packageValue)) {
signParams.add(new BasicNameValuePair("package", payReq.packageValue));
}
if (!TextUtils.isEmpty(payReq.partnerId)) {
signParams.add(new BasicNameValuePair("partnerid", payReq.partnerId));
}
if (!TextUtils.isEmpty(payReq.prepayId)) {
signParams.add(new BasicNameValuePair("prepayid", payReq.prepayId));
}
if (!TextUtils.isEmpty(payReq.timeStamp)) {
signParams.add(new BasicNameValuePair("timestamp", payReq.timeStamp));
}
return genAppSign(signParams);
}
/**
* 生成微信支付签名
*
* @param params
* @return
*/
private String genAppSign(List<NameValuePair> params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
}
sb.append("key=");
sb.append(Constants.WEIXIN_API_KEY); //秘钥
String appSign = MD5.getMessageDigest(sb.toString().getBytes());
return appSign;
}
注意:namevaluepair不能导包 http://blog.youkuaiyun.com/cyooke/article/details/51783572
参考这篇博客你可能会出现这样的问题
解决:
以上就完成了微信支付,