Android 支付寶和微信支付整合
場景
隨著移動支付的興起,在我們的app中,會經常有整合支付的需求.這時候一般都會採用微信和支付寶的sdk 來整合
支付寶支付
在使用支付寶支付的過程中,我們是在伺服器端生成訂單,客戶端訪問介面,得到訂單資訊.然後調起支付,支付成功後支付寶會分別 非同步呼叫伺服器端,同步呼叫客戶端返回支付結果.
開發步驟
①註冊支付寶賬號——進行實名認證——提交稽核資料——稽核通過
注意
-
申請要上傳你的apk和產品說明文件,產品截圖、介面使用場景、資費說明等,稽核通過後會得到商戶PID和私鑰。
-
開發者可以通過支付寶公鑰驗證訊息來源,同時可使用自己的私鑰對資訊進行加密。
- 商戶收款賬號即用於接收付款的賬號
② 下載官方Sdk Demo
,裡面包含文件.將該Demo中的PID,支付寶收款賬戶和使用者私鑰替換. 執行demo,檢視sdk呼叫方式,
PID對應的金鑰一共有三種加密方式,分別是MD5、RSA、DSA。Java開發者需要將金鑰轉換成PKCS8格式,並將公鑰上傳到支付寶.生成方式見文件.[支付寶開放平臺]
③ 匯入專案,客戶端呼叫,.首先將支付寶demo中的jar
包匯入到專案中,可以參照,demo中拼接引數,
//方法名稱:payTask.pay
//方法原型:
PayTask payTask = new PayTask(activity); String result = payTask.pay(orderInfo);
//方法功能:提供給商戶訂單支付功能。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
請求引數以鍵值對的形式拼裝到一個String中,引數具體說明詳見官方文件.
注意
- 除去sign、sign_type兩個引數外,其他需要使用到的引數皆是要簽名的引數
- sign值要做utf-8 URLencode
④ 修改Manifest
,新增com.alipay.sdk.app.H5PayActivity
和uses-permission
,並在proguard-project.txt
中新增相關的混淆規則即可.
⑤回撥處理,詳見 支付寶同步通知引數說明.out_trade_no
可以作為唯一標誌和伺服器端進行互動,當支付寶同步 通知後,客戶端通過out_trade_no
詢問伺服器端是否支付成功,因為真正的成功標誌是需要伺服器端來驗證的.
public AliPayResultS(String result) {
if (TextUtils.isEmpty(result))
return;
String[] resultParams = result.split("&");
for (String resultParam : resultParams) {
if (resultParam.startsWith("out_trade_no")) {
out_trade_no = gatValue(resultParam, "out_trade_no");
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
微信支付
同樣,有了支付寶支付,呢麼微信支付也不可缺少,微信支付和支付寶支付流程,大體相同,通過伺服器端獲取訂單資訊返回給客戶端,客戶端呼叫sdk進行支付,支付完成後進行同步和非同步回撥.
開發步驟
①獲取appId
同樣需要獲取appid,登記並選擇移動應用進行設定後,將該應用提交稽核,只有稽核通過並獲取appId的應用才能進行開發。
②下載Android 微信支付demo.
我們所需要關注的依舊是PayActivity
.使用微信的登陸和支付,大家都知道,需要在專案下新建一個wxapi資料夾來實現回撥.
③專案整合,首先我們需要將libammsdk.jar
匯入到lib目錄下,這個是核心jar包.同時修改Manifest
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
④介面呼叫.
首先我們需要初始化一個IWXAPI api
,並註冊到應用,
api.registerApp(Constants.APP_ID);
PayReq req = new PayReq();
//....拼接req引數
api.sendReq(req);// 呼叫支付
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
注意
- 微信支付並不會像支付寶那樣,支付寶沒有安裝預設會呼叫H5PayActivity
- 微信支付前,最好判斷下是否安裝微信
//判斷是否安裝微信
private boolean isWXAppInstalledAndSupported(IWXAPI msgApi) {
msgApi.registerApp(Constants.APP_ID);
boolean sIsWXAppInstalledAndSupported = msgApi.isWXAppInstalled()
&& msgApi.isWXAppSupportAPI();
return sIsWXAppInstalledAndSupported;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
⑤支付回撥.
在支付回撥類WXPayEntryActivity
的onResp(BaseResp
resp)
方法中我們可以得到 客戶端 和伺服器 唯一標誌prepayid
引數,來實現支付成功的後續處理.
// 支付成功
if (resp instanceof com.tencent.mm.sdk.modelpay.PayResp) {
com.tencent.mm.sdk.modelpay.PayResp payResp = (PayResp) resp;
String prepayId = payResp.prepayId;
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
ps: 微信支付中需要注意的是支付回撥方法.支付回撥必須在專案中建立一個wxapi目錄,並命名為WXPayEntryActivity
(包名或類名不一致會造成無法回撥),回撥方法中獲取prepayId
.
// 第三方應用傳送到微信的請求處理後的響應結果,會回撥到該方法
@Override
public void onResp(BaseResp baseResp) {
// String result = "";
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// result = "傳送成功";
{
Intent intent = new Intent(Constants.payAction);
intent.putExtra(Constants.prepayId, ((PayResp) baseResp).prepayId);
mLocalBroadcastManager.sendBroadcast(intent);
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
// result = "傳送取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
// result = "傳送被拒絕";
break;
default:
// result = "傳送返回";
break;
}
finish();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
最後,微信支付不能使用debug的,因為要驗證簽名等.否則支付不成功
封裝
為了方便,將上面程式碼進行封裝ShareLoginPay,只需配置好相關的 appid
,即可使用,
以微信支付為例
//初始化appid
PayBlock.getInstance().initWechatPay("");
//調起支付
String payInfo = "";
PayReq req = WechatOderInfo.getWeixinPayReq(payInfo);
WxpayUtil.weixinPay(req, new WxpayResultListener() {
@Override public void payResult(PayResp payResp) {
String prepayId = payResp.prepayId;
Toast.makeText(MainActivity.this, "prepayid--->" + prepayId,
Toast.LENGTH_SHORT).show();
}
@Override public void onError(int errCode) {
Toast.makeText(MainActivity.this, "onError()-->" + errCode,
Toast.LENGTH_SHORT).show();
}
@Override public void onCancel() {
Toast.makeText(MainActivity.this, "onCancel()", Toast.LENGTH_SHORT).show();
}
@Override public void notSupport() {
Toast.makeText(MainActivity.this, "沒有安裝微信,或版本太低", Toast.LENGTH_SHORT)
.show();
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
完整demo: