1. 程式人生 > >Android微信支付和支付寶支付快速接入

Android微信支付和支付寶支付快速接入

一、支付寶接入

1、建立應用並獲取APPID

開發者中心中建立您的應用,會為您生成應用唯一標識(APPID),並且可以申請開通開放產品使用許可權,通過APPID您的應用才能呼叫開放產品的介面能力。在“我的應用”中按下圖方式檢視APPID。

2、新增支付功能

3、簽約(涉及到收費

4、配製金鑰(簽約後,支付寶提供專門的工具來生工公鑰私鑰等,按要求生成就可以了)

為了保證交易雙方(商戶和支付寶)的身份和資料安全,開發者在呼叫介面前,需要配置雙方金鑰,對交易資料進行雙方校驗。 
金鑰包含
應用公鑰:由商戶自己生成的RSA公鑰(與應用私鑰必須匹配),商戶需上傳應用公鑰到支付寶開放平臺,以便支付寶使用該公鑰驗證該交易是否是商戶發起的。

應用私鑰:由商戶自己生成的RSA私鑰(與應用公鑰必須匹配),商戶開發者使用應用私鑰對請求字串進行加簽。
支付寶公鑰:支付寶的RSA公鑰,商戶使用該公鑰驗證該結果是否是支付寶返回的。生成金鑰後在開放平臺開發者中心進行金鑰配置,配置完成後可以獲取支付寶公鑰。具體方法流程請參見上傳應用公鑰並獲取支付寶公鑰。當然這各種金鑰等還是扔到後臺儲存比較好,這樣前期準備工作就基本完成了。

整合與開發:

1、將alipaySdk-xxxxxxxx.jar包放入商戶應用工程的libs目錄下

2、或者在app module下的build.gradle下手動新增依賴:compile files('libs/alipaySdk-20170725.jar')

3、在應用工程的AndroidManifest.xml檔案裡面新增宣告:(這個當手機沒有應用寶的時候喚起H5支付寶登入介面)

<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges="orientation|keyboardHidden|navigation|screenSize"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
 <activity
    android:name="com.alipay.sdk.app.H5AuthActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind"
    android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>

和許可權宣告:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4、新增混淆規則(看個人)

在應用工程的proguard-project.txt裡新增以下相關規則:

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
    <fields>;
    <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}

-keep class com.ut.device.** { *;}

至此,開發包開發資源匯入完成。

支付呼叫:

PayTask物件主要為商戶提供訂單支付、查詢功能,及獲取當前開發包版本號。

獲取PayTask支付物件呼叫支付(支付行為需要在獨立的非ui執行緒中執行),程式碼示例:

final String orderInfo = info;   // 訂單資訊(必須來源於服務端)
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(DemoActivity.this);
String result = alipay.payV2(orderInfo,true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
    // 必須非同步呼叫
Thread payThread = new Thread(payRunnable);

payThread.start();

引數名稱引數說明
String orderInfoapp支付請求引數字串,主要包含商戶的訂單資訊,key=value形式,以&連線。

boolean isShowPayLoading    使用者在商戶app內部點選付款,是否需要一個loading做為在錢包喚起之前的過渡,這個值設定為true,將會在呼叫pay介面的時候直接喚起一個loading,直到喚起H5支付頁面或者喚起外部的錢包付款頁面loading才消失。(建議將該值設定為true,優化點選付款到支付喚起支付頁面的過渡過程。)

orderStr示例如下,引數說明見"請求引數說明":

app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA2&timestamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D

支付結果獲取和處理:

呼叫pay方法支付後,將通過2種途徑獲得支付結果:
同步返回
商戶應用客戶端通過當前呼叫支付的Activity的Handler物件,通過它的回撥函式獲取支付結果。(可參考alipay_demo實現)
程式碼示例:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
Result result = new Result((String) msg.obj);
Toast.makeText(DemoActivity.this, result.getResult(),
Toast.LENGTH_LONG).show();
};
};
非同步通知

商戶需要提供一個http協議的介面,包含在請求支付的入參中,其key對應notify_url。支付寶伺服器在支付完成後,會以POST方式呼叫notify_url傳輸資料。

至此,支付寶支付就整合好了

二、微信支付

1、建立應用並獲取APPID


商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的唯一標識APPID。由於需要保證支付安全,需要在開放平臺繫結商戶應用包名和應用簽名,設定好後才能正常發起支付。

應用包名:是在APP專案配置檔案AndroidManifest.xml中宣告的package值,例如DEMO中的package="net.sourceforge.simcpux"。

應用簽名:根據專案的應用包名和編譯使用的keystore,可由簽名工具生成一個32位的md5串,在除錯的手機上安裝簽名工具後,執行可生成應用簽名串

註冊成功後,需要開啟微信支付許可權(299刀,4個工作日左右基本就有結果)每筆支付還有抽成

2、匯入微信最新SKD:libammsdk.jar。

3、註冊APPID
商戶APP工程中引入微信JAR包,呼叫API前,需要先向微信註冊您的APPID,程式碼如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 將該app註冊到微信

msgApi.registerApp("APPID");

4、調起支付

商戶伺服器生成支付訂單,先呼叫統一下單API(詳見第7節)生成預付單,獲取到prepay_id後將引數再次簽名傳輸給APP發起支付。以下是調起微信支付的關鍵程式碼:訂單資訊(出於安全最好服務端返回)

IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(request);

引數說明:


5、支付回撥介面

參照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路徑中實現WXPayEntryActivity類(包名或類名不一致會造成無法回撥),在WXPayEntryActivity類中實現onResp函式,支付完成後,微信APP會返回到商戶APP並回調onResp函式,開發者需要在該函式中接收通知,判斷返回錯誤碼,如果支付成功則去後臺查詢支付結果再展示使用者實際支付結果。注意一定不能以客戶端返回作為使用者支付的結果,應以伺服器端的接收的支付通知或查詢API返回的結果為準。程式碼示例如下:

publicvoidonResp(BaseRespresp){

     if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
         Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
         AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
         builder.setTitle(R.string.app_tip);
     }
 } 

返回結果


至此,微信支付就整合好了