Android微信支付詳細流程(包括手機端和伺服器端)
阿新 • • 發佈:2019-01-07
相關檔案下載地址:http://download.csdn.net/detail/s_alics/9383437點選開啟連結
******************************************************************************************************************************************
整合微信支付的前提是:Ⅰ、你的app已經在微信開放平臺上註冊簽名,並稽核通過;Ⅱ、伺服器端已經準備完善。
******************************************************************************************************************************************
1、首先,要在你的工程裡匯入微信支付jar包:libammsdk.jar ;(若用Eclipse記得Build!)
②、Constants.java類裡存放的是你們工程在微信開放者平臺上申請的App的兩個重要引數:APP_ID和PARTNER_ID,這兩個引數是要在調起微信支付時傳入PayReq的必要引數; 如果不匯入Constants.java這個類,那就把裡面的引數直接寫到相關類裡就可以(相關類包括:調起支付的類和WXPayEntryActivity.java這個類 );
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wx2ace48ba2fddb77c" />★這裡的scheme值是你的App在 微信平臺註冊時所給的App_ID。
4、伺服器端:需要把libammsdk.jar包匯入伺服器(為了進行MD5加密),需要把Demo裡的MD5這個類放到伺服器;MD5加密最好在伺服器進行,使支付更安全。(當然也可以在手機端加密,只是這樣不能絕對保證安全)。
********************************************************************************************************************************************
到這裡,微信支付手機端的準備工作已經完成!下面說說具體操作:
********************************************************************************************************************************************
微信支付手機的邏輯是:①、手機端向伺服器傳送請求(具體請求引數根據自己app情況拼接),接收伺服器返回的調起支付的必要引數,
這些引數包括:prepayId、nonceStr、timeStamp、sign,當然,要調起支付還需要:appId、partnerId、packageValue這三個引數,不過這三個引數的值都是固定的,不用請求。
②、將從伺服器請求到的引數以及本地存有的固定引數一起設定到PayReq:// 設定調起微信支付引數
private void setPayData() {
// 設定微信支付請求引數
PayReq req = new PayReq();
req.appId = APP_ID;//微信開放平臺的appId
req.partnerId = MCH_ID;//商戶號
req.prepayId = perpayId;//預支付訂單號
req.packageValue = "Sign=WXPay";
req.nonceStr = nonceStr;
req.timeStamp = timeStamp;
req.sign = wxSign;
}
③、最後調起微信支付:private final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
msgApi.registerApp(APP_ID);
// 發起支付請求
msgApi.sendReq(req);
*********************************************************************************************************************************************
下面是一些需要注意的細節問題。
*********************************************************************************************************************************************
1、微信支付的Demo裡還有好多類,比如:MD5、MD5Utils、AppRegister以及Util等,其中,MD5這個類是需要給伺服器端的,而其他的幾個類,我根本沒用到,或許是我還不太懂微信支付,反正無論如何,沒用那些個類,我也順利集成了微信支付。
2、伺服器端在進行MD5加密的時候,涉及到兩個類:NameValuePair和BasicNameValuePair,當把那些引數封裝到集合的時候,必須是以下格式(Android固定格式):
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("appkey", APP_KEY));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genSign(signParams);
//獲取簽名方法
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.API_KEY);
String appSign = MD5.getMessageDigest(sb.toString().getBytes())
.toUpperCase();
return appSign;
}
******************************************************************************************************************************************
整合微信支付的前提是:Ⅰ、你的app已經在微信開放平臺上註冊簽名,並稽核通過;Ⅱ、伺服器端已經準備完善。
******************************************************************************************************************************************
1、首先,要在你的工程裡匯入微信支付jar包:libammsdk.jar
2、其次,在你的工程里加入相關類:
①、直接匯入wxapi這個包(包裡有WXPayEntryActivity.java這個類),如果之前專案整合過微信第三方分享,那你的工程裡肯定就有wxapi這個包,那就直接把WXPayEntryActivity.java這個類匯入wxapi裡即可;
②、Constants.java類裡存放的是你們工程在微信開放者平臺上申請的App的兩個重要引數:APP_ID和PARTNER_ID,這兩個引數是要在調起微信支付時傳入PayReq的必要引數; 如果不匯入Constants.java這個類,那就把裡面的引數直接寫到相關類裡就可以(相關類包括:調起支付的類和WXPayEntryActivity.java這個類
3、最後,在工程的配置檔案裡的發起調起微信支付的activity裡新增過濾條件:
<activity
android:name="com.shbwang.housing.activity.OrderPaymentActivity"android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wx2ace48ba2fddb77c" />★這裡的scheme值是你的App在 微信平臺註冊時所給的App_ID。
</intent-filter>
</activity>4、伺服器端:需要把libammsdk.jar包匯入伺服器(為了進行MD5加密),需要把Demo裡的MD5這個類放到伺服器;MD5加密最好在伺服器進行,使支付更安全。(當然也可以在手機端加密,只是這樣不能絕對保證安全)。
********************************************************************************************************************************************
到這裡,微信支付手機端的準備工作已經完成!下面說說具體操作:
********************************************************************************************************************************************
微信支付手機的邏輯是:①、手機端向伺服器傳送請求(具體請求引數根據自己app情況拼接),接收伺服器返回的調起支付的必要引數,
這些引數包括:prepayId、nonceStr、timeStamp、sign,當然,要調起支付還需要:appId、partnerId、packageValue這三個引數,不過這三個引數的值都是固定的,不用請求。
②、將從伺服器請求到的引數以及本地存有的固定引數一起設定到PayReq:// 設定調起微信支付引數
private void setPayData() {
// 設定微信支付請求引數
PayReq req = new PayReq();
req.appId = APP_ID;//微信開放平臺的appId
req.partnerId = MCH_ID;//商戶號
req.prepayId = perpayId;//預支付訂單號
req.packageValue = "Sign=WXPay";
req.nonceStr = nonceStr;
req.timeStamp = timeStamp;
req.sign = wxSign;
}
③、最後調起微信支付:private final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
msgApi.registerApp(APP_ID);
// 發起支付請求
msgApi.sendReq(req);
*********************************************************************************************************************************************
下面是一些需要注意的細節問題。
*********************************************************************************************************************************************
1、微信支付的Demo裡還有好多類,比如:MD5、MD5Utils、AppRegister以及Util等,其中,MD5這個類是需要給伺服器端的,而其他的幾個類,我根本沒用到,或許是我還不太懂微信支付,反正無論如何,沒用那些個類,我也順利集成了微信支付。
2、伺服器端在進行MD5加密的時候,涉及到兩個類:NameValuePair和BasicNameValuePair,當把那些引數封裝到集合的時候,必須是以下格式(Android固定格式):
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("appkey", APP_KEY));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genSign(signParams);
//獲取簽名方法
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.API_KEY);
String appSign = MD5.getMessageDigest(sb.toString().getBytes())
.toUpperCase();
return appSign;
}