1. 程式人生 > >Android微信支付詳細流程(包括手機端和伺服器端)

Android微信支付詳細流程(包括手機端和伺服器端)

相關檔案下載地址:http://download.csdn.net/detail/s_alics/9383437點選開啟連結
******************************************************************************************************************************************

   整合微信支付的前提是:Ⅰ、你的app已經在微信開放平臺上註冊簽名,並稽核通過;Ⅱ、伺服器端已經準備完善。

******************************************************************************************************************************************

  1、首先,要在你的工程裡匯入微信支付jar包:libammsdk.jar
;(若用Eclipse記得Build!)

  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;
    }