Android微信支付接入
微信支付的appid獲取什麼的就不提了
第三方依賴
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.1.4'
需要新建包wxapi,新建activity名字需為WXPayEntryActivity並且實現IWXAPIEventHandler介面,該介面為顯示微信支付結果頁面
resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX&&String.valueOf(resp.errCode).equals("0")
為支付成功,不過支付成功的判斷還是需要請求後臺獲取。
微信支付的封裝,封裝了兩種方式
一種不需要在客戶端簽名,由後臺返回資料,調起微信支付
另一種是需求需要在客戶端簽名,由後臺返回資料進行簽名後調起微信支付
public class WXPayUtils { private IWXAPI iwxapi; //微信支付api private WXPayBuilder builder; private WXPayUtils(WXPayBuilder builder) { this.builder = builder; } /** * 調起微信支付的方法,不需要在客戶端簽名 **/ public void toWXPayNotSign(Context context, String appid) { iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api iwxapi.registerApp(appid); //註冊appidappid可以在開發平臺獲取 Runnable payRunnable = new Runnable() {//這裡注意要放在子執行緒 @Override public void run() { PayReq request = new PayReq(); //調起微信APP的物件 //下面是設定必要的引數,也就是前面說的引數,這幾個引數從何而來請看上面說明 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("chx", "run: " + 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) { iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api iwxapi.registerApp(appid); //註冊appidappid可以在開發平臺獲取 Runnable payRunnable = new Runnable() {//這裡注意要放在子執行緒 @Override public void run() { if (TextUtils.isEmpty(builder.getAppId()) || TextUtils.isEmpty(builder.getPartnerId()) || TextUtils.isEmpty(builder.getPrepayId())) { Log.e("chx", "toWXPayAndSign: " + "必須在builder中設定appId、PartnerId、PrepayId"); return; } PayReq request = new PayReq(); //調起微信APP的物件 //下面是設定必要的引數,也就是前面說的引數,這幾個引數從何而來請看上面說明 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; } } }
呼叫方法,從後臺獲取到資料後設置呼叫微信支付(該為無需客戶端簽名的呼叫方法)
WXPayUtils.WXPayBuilder builder = new WXPayUtils.WXPayBuilder(); JSONObject object = jsonObject.optJSONObject("obj"); builder.setAppId(object.optString("appid")) .setPartnerId(object.optString("partnerid")) .setPrepayId(object.optString("prepayid")) .setPackageValue(object.optString("package")) .setNonceStr(object.optString("noncestr")) .setTimeStamp(object.optString("timestamp")) .setSign(object.optString("sign")) .build().toWXPayNotSign(MainActivity.this, object.optString("appid"));
需要後臺簽名的呼叫方法toWXPayAndSign
不會寫後臺,沒有微信支付許可權的我,今天沒有demo~~~