相比之前的支付寶sdk,新版的sdk不再判斷App客戶端是否安裝了支付寶客戶端泞辐。如果用戶安裝了支付寶贡羔,將跳到支付寶客戶端支付派继;如果用戶沒有安裝支付寶客戶端,將跳到 sdk中的H5PayActivity 中進行支付捌袜。xml中需要對這個H5Pay進行聲明。
下文為對支付寶demo的使用整理。猎提。
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
有的demo中自己搞了一個H5PayActivity,完全沒必要旁蔼,只會誤導锨苏。。棺聊。
一伞租、支付流程
- 拼裝支付寶認同的訂單信息--orderInfo
- 對訂單做RSA 簽名---sign
- 對簽名后的訂單信息做URL編碼---sign
- 拼裝完整的訂單信息,即orderInfo+sign+簽名方式(固定)
- 進行支付(異步任務)
二限佩、支付前準備
- PARTNER 商戶PID
- SELLER 商戶收款方賬號
- RSA_PRIVATE 商戶私鑰葵诈,pkcs8 格式
- alipay_notify 支付寶異步通知地址,同自家服務端商量
- 支付寶sdk
三祟同、開始支付
-
拼裝訂單信息orderInfo
//s為商品的價格作喘,單位為元!D涂鳌;捕肌!
String orderInfo = getOrderInfo("商品名", "商品描述", “商品價格广辰,s);
/**
* create the order info. 創(chuàng)建訂單信息
*/
private String getOrderInfo(String subject, String body, String price) {
// 簽約合作者身份ID
String orderInfo = "partner=" + "\"" + Constans.PARTNER + "\"";
// 簽約賣家支付寶賬號
orderInfo += "&seller_id=" + "\"" + Constans.SELLER + "\"";
// 商戶網(wǎng)站唯一訂單號---我們是由服務器返回的
orderInfo += "&out_trade_no=" + "\"" + out_Trade + "\"";
// 商品名稱
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品詳情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金額
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服務器異步通知頁面路徑
orderInfo += "¬ify_url=" + "\"" + Constans.alipay_notify + "\"";
// 服務接口名稱暇矫, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";
// 支付類型主之, 固定值
orderInfo += "&payment_type=\"1\"";
// 參數(shù)編碼, 固定值
orderInfo += "&_input_charset=\"utf-8\"";
// 設置未付款交易的超時時間
// 默認30分鐘李根,一旦超時槽奕,該筆交易就會自動被關(guān)閉。
// 取值范圍:1m~15d房轿。
// m-分鐘粤攒,h-小時,d-天囱持,1c-當天(無論交易何時創(chuàng)建夯接,都在0點關(guān)閉)。
// 該參數(shù)數(shù)值不接受小數(shù)點纷妆,如1.5h盔几,可轉(zhuǎn)換為90m。
orderInfo += "&it_b_pay=\"30m\"";
// extern_token為經(jīng)過快登授權(quán)獲取到的alipay_open_id,帶上此參數(shù)用戶將使用授權(quán)的賬戶進行支付
//orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付寶處理完請求后掩幢,當前頁面跳轉(zhuǎn)到商戶指定頁面的路徑逊拍,可空
orderInfo += "&return_url=\"m.alipay.com\"";
return orderInfo; }
-
對訂單信息做RSA 簽名
String sign = sign(orderInfo);
//SignUtils為支付寶demo中的類,SignUtils中用到的Base64也是demo中的類,復制即可
private String sign(String content) {
return SignUtils.sign(content, Constans.RSA_PRIVATE);
}
-
對簽名后的訂單信息做URL編碼
try {
/**
* 僅需對sign 做URL編碼
*/
sign = URLEncoder.encode(sign, "UTF-8");}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} -
拼裝支付寶認同的訂單信息
final String payInfo = orderInfo + "&sign="" + sign + ""&" + getSignType();
/**
* get the sign type we use. 獲取簽名方式
*/
private String getSignType() {
return "sign_type=\"RSA\"";
}
-
調(diào)用支付寶sdk開始支付(異步任務)
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 構(gòu)造PayTask 對象
PayTask alipay = new PayTask(RechargeActivity.this);
// 調(diào)用支付接口际邻,獲取支付結(jié)果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
} };
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();}
Handler中對支付結(jié)果進行獲取
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
/**
* 同步返回的結(jié)果必須放置到服務端進行驗證(驗證的規(guī)則請看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建議商戶依賴異步通知
*/
//PayResult為demo中的類芯丧,復制
String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(RechargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
finish();
} else {
// 判斷resultStatus 為非"9000"則代表可能支付失敗
// "8000"代表支付結(jié)果因為支付渠道原因或者系統(tǒng)原因還在等待支付結(jié)果確認世曾,最終交易是否成功以服務端異步通知為準(小概率狀態(tài))
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(RechargeActivity.this, "支付結(jié)果確認中", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "4000")) {
Toast.makeText(RechargeActivity.this, "訂單支付失敗", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "5000")) {
Toast.makeText(RechargeActivity.this, "重復請求", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "6001")) {
Toast.makeText(RechargeActivity.this, "中途取消", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "6002")) {
Toast.makeText(RechargeActivity.this, "網(wǎng)絡連接出錯", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "6004")) {
Toast.makeText(RechargeActivity.this, "支付結(jié)果未知缨恒,請查詢交易記錄", Toast.LENGTH_SHORT).show();
} else if (TextUtils.equals(resultStatus, "其它")) {
Toast.makeText(RechargeActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}
}
break;
}
default:
break;
}
} ;};
到此,支付基本完成轮听,按照官方demo配置應該都可以的肿轨!