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×tamp=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發起支付。以下是調起微信支付的關鍵程式碼:訂單資訊(出於安全最好服務端返回)
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);
}
}
返回結果
至此,微信支付就整合好了