古詩詞大全網 - 個性簽名 - 接入支付寶支付SDK

接入支付寶支付SDK

接入支付寶支付SDK

可以說支付寶支付接入是所有SDK最好接入的,沒有之壹。

客戶端不用簽名,也不用管包名,也不用管簽名文件,就接口返回訂單,把訂單交給支付寶SDK調用就行,成功或者失敗都在當前界面返回給妳。妳再去通知接口。

支付流程圖

官方文檔地址

!支付寶支付官方文檔地址

按照文檔說明接入SDK和相關配置,在這就不重復了

客戶端支付關鍵代碼===》支付接口的調用(調起支付彈框)

記住支付接口的調用必須在獨立的非ui線程中執行,即需新開線程裏面調用。可以想官方demo壹樣用new Thread方式。

下面我給出用Observable方式示例代碼

在PayUtils中

/**

* desc:支付寶支付

* Created by congge on 2018/8/27 17:20

* @param orderInfo 接口返回的訂單

**/

public static void aliPay(final Activity activity, final String orderInfo, final OrderListener orderListener) {

Observable.just(orderInfo)

.map(new Function () {

@Override

public String apply(String orderInfo) throws Exception {

//用戶在商戶app內部點擊付款,是否需要壹個loading做為在錢包喚起之前的過渡,這個值設置為true

return new PayTask(activity).pay(orderInfo, true);

}

})

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Consumer () {

@Override

public void accept(String payResult) throws Exception {

orderListener.onPayResult(payResult);

}

});

}

支付結果返回處理

返回例子:

resultStatus={9000};memo={};result={{"alipay_trade_app_pay_response":{"code":"10000","msg":"Success","app_id":"2016091300503896","auth_app_id":"2016091300503896","charset":"utf-8","timestamp":"2018-08-28 17:51:11","out_trade_no":"nVElbd74TW6WnEyxQwvX8A","total_amount":"0.01","trade_no":"2018082821001004680500208879","seller_id":"2088102175487650"},"sign":"W0Hg9k4GxL8Oaxymvqk2i65WNDQxYp6HGve32ek6VjSRnymmI3GQTjpQVbZuDzvjcwQ/HIkM97PoBGAVlTmi/wiJcqDgSSDzDY7AFnNN0OcK0ehWGwKQINA4IDGh51A7yY/vYKmR0VW+2OwGhlRPPMMZtQOEqh8a9/aIijzT6ZLwy9Hl4ayG/fVKhdC1VdckF6+C25BFNp3fIxarg5tfEunm7N9iWngKCUsnP+IZz05OHdvynimgYPcBnbBERHG97GVqRT/EdBWTQyIDMc0LemScAYxJixTVgXDkRddQjzWZ7HgLdBfjs0nXY24puHudT76ERxVY+8NkoKle/QI+FA==","sign_type":"RSA2"}}

也可以自己打log看看

處理示例代碼:

//支付寶支付

PayUtils.aliPay(this, result.getSignDataStr(), new PayUtils.OrderListener() {

@Override

public void onPayResult(String payResult) {

PayResult pr = new PayResult(payResult);

String rs = pr.getResultStatus();

String r = pr.getResult();

switch (rs) {

case AliPayResultStatus.PAY_SUCCESS:

ToastUtils.show(R.string.pay_success);

//通知接口支付成功

break;

case AliPayResultStatus.PAY_PROCESSING:

case AliPayResultStatus.PAY_UNKNOWN:

ToastUtils.show(R.string.pay_fail);

//支付可能成功,要接口去查詢

break;

default:

ToastUtils.show(R.string.pay_fail);

//通知接口支付失敗,取消訂單

}

}

});

上面方法中:

//通知接口支付成功 //支付可能成功,要接口去查詢 //通知接口支付失敗,取消訂單。根據妳產品需求要不要通知妳服務器做的操作。正常是要的,用來改變訂單狀態

PayResult.class

public class PayResult {

private String resultStatus;

private String result;

private String memo;

public PayResult(String rawResult) {

if (TextUtils.isEmpty(rawResult))

return;

String[] resultParams = rawResult.split(";");

for (String resultParam : resultParams) {

if (resultParam.startsWith("resultStatus")) {

resultStatus = gatValue(resultParam, "resultStatus");

}

if (resultParam.startsWith("result")) {

result = gatValue(resultParam, "result");

}

if (resultParam.startsWith("memo")) {

memo = gatValue(resultParam, "memo");

}

}

}

@Override

public String toString() {

return "resultStatus={" + resultStatus + "};memo={" + memo

+ "};result={" + result + "}";

}

private String gatValue(String content, String key) {

String prefix = key + "={";

return content.substring(content.indexOf(prefix) + prefix.length(),

content.lastIndexOf("}"));

}

public String outOrder() {

String order = ""out_trade_no"";

if (result.contains(order)) {

String begin = result.substring(result.indexOf(order));

String ss = begin.split(",")[0];

String newS = ss.replace(""", "")

.replace("}", "")

.replace(":", "")

.replace("out_trade_no", "");

try {

return newS;

} catch (Exception e) {

e.printStackTrace();

}

}

return "";

}

/**

* @return the resultStatus

*/

public String getResultStatus() {

return resultStatus;

}

/**

* @return the memo

*/

public String getMemo() {

return memo;

}

/**

* @return the result

*/

public String getResult() {

return result;

}}

最後給下支付返回碼表

AliPayResultStatus.class

public class AliPayResultStatus {

/**

* 訂單支付成功,唯壹肯定是支付成功的

*/

public static final String PAY_SUCCESS = "9000";

/**

* 正在處理中,支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態

*/

public static final String PAY_PROCESSING = "8000";

/**

* 訂單支付失敗

*/

public static final String PAY_FAIL = "4000";

/**

* 重復請求

*/

public static final String PAY_REPEAT = "5000";

/**

* 用戶中途取消

*/

public static final String PAY_PROCESS_CANCEL = "6001";

/**

* 網絡連接出錯

*/

public static final String PAY_NET_ERROR = "6002";

/**

* 支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態

*/

public static final String PAY_UNKNOWN = "6004";}

還有壹個直接棄用沙箱調試模式,否則提示支付失敗也有可能不知道錯在那,怕金額大,和接口商量,測試服務器就用0.01測試。