犹豫调试微信支付遇到很多坑,在这里特意封总结一下 包括本地签名与服务器返回签名两个方法。
直接上代码:
/** * Created by yang * 微信支付工具类 */ public class WXPayUtils { //微信支付api private IWXAPI iwxapi; private WXPayBuilder builder; private WXPayUtils(WXPayBuilder builder) { this.builder = builder; } /** * 调起微信支付的方法,不需要在客户端签名 **/ public void toWXPayNotSign(Context context, String appid) { //初始化微信api iwxapi = WXAPIFactory.createWXAPI(context, null); //注册appid appid可以在开发平台获取 iwxapi.registerApp(appid); //这里注意要放在子线程 Runnable payRunnable = new Runnable() { @Override public void run() { //调起微信APP的对象 PayReq request = new PayReq(); //下面是设置必要的参数,也就是前面说的参数,这几个参数从何而来请看上面说明 request.appId = builder.getAppId(); request.partnerId = builder.getPartnerId(); request.prepayId = builder.getPrepayId(); request.packageValue = "Sign=WXPay"; request.nonceStr = builder.getNonceStr(); request.timeStamp = builder.getTimeStamp(); request.sign = builder.getSign(); Log.e("--------------->", "" + request.appId + request.nonceStr + request.sign); //发送调起微信的请求 iwxapi.sendReq(request); } }; Thread payThread = new Thread(payRunnable); payThread.start(); } /** * 调起微信支付的方法,需要在客户端签名 **/ public void toWXPayAndSign(Context context, String appid, final String key) { //初始化微信api iwxapi = WXAPIFactory.createWXAPI(context, null); //注册appid appid可以在开发平台获取 iwxapi.registerApp(appid); //这里注意要放在子线程 Runnable payRunnable = new Runnable() { @Override public void run() { if (TextUtils.isEmpty(builder.getAppId()) || TextUtils.isEmpty(builder.getPartnerId()) || TextUtils.isEmpty(builder.getPrepayId())){ Log.e("--------------->", "+"必须在builder中设置appId、PartnerId、PrepayId"); return; } //调起微信APP的对象 PayReq request = new PayReq(); //下面是设置必要的参数,也就是前面说的参数,这几个参数从何而来请看上面说明 request.appId = builder.getAppId(); request.partnerId = builder.getPartnerId(); request.prepayId = builder.getPrepayId(); request.packageValue = "Sign=WXPay"; request.nonceStr = genNonceStr(); request.timeStamp = String.valueOf(genTimeStamp()); request.sign = builder.getSign(); //签名 LinkedHashMap<String, String> signParams = new LinkedHashMap<>(); signParams.put("appid", request.appId); signParams.put("noncestr", request.nonceStr); signParams.put("package", request.packageValue); signParams.put("partnerid", request.partnerId); signParams.put("prepayid", request.prepayId); signParams.put("timestamp", request.timeStamp); request.sign = genPackageSign(signParams,key); //发送调起微信的请求 iwxapi.sendReq(request); } }; Thread payThread = new Thread(payRunnable); payThread.start(); } /** * 调起微信APP支付,签名 * 生成签名 */ private String genPackageSign(LinkedHashMap<String, String> params, String key) { StringBuilder sb = new StringBuilder(); for (Map.Entry<String,String> entry: params.entrySet()) { sb.append(entry.getKey()); sb.append('='); sb.append(entry.getValue()); sb.append('&'); } sb.append("key="); sb.append(key); String packageSign = getMessageDigest(sb.toString().getBytes()).toUpperCase(); return packageSign; } /** * md5加密 * @param buffer * @return */ private 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; } } /** * 获取随机数 * * @return */ private String genNonceStr() { Random random = new Random(); return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); } /** * 获取时间戳 * * @return */ private long genTimeStamp() { return System.currentTimeMillis() / 1000; } public static class WXPayBuilder { public String appId; public String partnerId; public String prepayId; public String packageValue; public String nonceStr; public String timeStamp; public String sign; public WXPayUtils build() { return new WXPayUtils(this); } public String getAppId() { return appId; } public WXPayBuilder setAppId(String appId) { this.appId = appId; return this; } public String getPartnerId() { return partnerId; } public WXPayBuilder setPartnerId(String partnerId) { this.partnerId = partnerId; return this; } public String getPrepayId() { return prepayId; } public WXPayBuilder setPrepayId(String prepayId) { this.prepayId = prepayId; return this; } public String getPackageValue() { return packageValue; } public WXPayBuilder setPackageValue(String packageValue) { this.packageValue = packageValue; return this; } public String getNonceStr() { return nonceStr; } public WXPayBuilder setNonceStr(String nonceStr) { this.nonceStr = nonceStr; return this; } public String getTimeStamp() { return timeStamp; } public WXPayBuilder setTimeStamp(String timeStamp) { this.timeStamp = timeStamp; return this; } public String getSign() { return sign; } public WXPayBuilder setSign(String sign) { this.sign = sign; return this; } } } |
调用 客户端签名支付:
//微信支付 private void inWXPAY(PaymentOrderBean payInfo) { WXPayUtils.WXPayBuilder builder = new WXPayUtils.WXPayBuilder(); builder.setAppId(payInfo.getData().getAppid()) .setPartnerId(payInfo.getData().getMch_id()) .setPrepayId(payInfo.getData().getPrepay_id()) .setPackageValue("Sign=WXPay") .build() .toWXPayAndSign(SubmitOrderActivity.this,"payInfo.getData().getAppid()","yimofang201803202035appartmofang"); } |
调用服务端签名:
//微信支付 private void inWXPAY(PaymentOrderBean payInfo) { WXPayUtils.WXPayBuilder builder = new WXPayUtils.WXPayBuilder(); builder.setAppId(payInfo.getData().getAppid()) .setPartnerId(payInfo.getData().getMch_id()) .setPrepayId(payInfo.getData().getPrepay_id()) .setPackageValue("Sign=WXPay") .build() .toWXPayNotSign(SubmitOrderActivity.this,payInfo.getData().getAppid()); } |
微信支付注意事项: 如果服务器返回签名的话 一定要保证签名正确,否则调不起支付界面, 同时保证自己apk签名正确。