Android 调用支付宝

1,564 阅读2分钟

1.接入支付宝

接入前准备

  • 商户需要进行审核签约
  • 密钥管理(生成公私钥)

正式接入

服务端 私钥必须放在服务端,签名过程必须放在服务端。

客户端(Android)

  1. 根据用户选择商品请求服务端获取订单和签名,
  2. 根据服务端返回订单和签名调起支付宝App支付,并对支付返回结果做处理。

2.Android 集成并调用支付宝

  • . 添加jar包
  • . gradle中添加依赖

	PayTask payTask = new PayTask(AboutUsActivity.this);
	Map<String, String> result = payTask.payV2(orderInfo, true);
orderInfo :服务端返回的订单信息。

3.返回结果处理(全部代码)

/**
 * 支付宝
 * @param strURL
 */
private void aliPay(String strURL) {
    Observable.create(new ObservableOnSubscribe<Object>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<Object> e) throws Exception {
            String orderInfo = OkClient.get(strURL, new JSONObject());//获取订单信息
            orderInfo = orderInfo.replace("amp;", "");//后台PHP,返回的所有&参数都变成&amp,所有需要替换。
            PayTask payTask = new PayTask(AboutUsActivity.this);
            Map<String, String> result = payTask.payV2(orderInfo, true);
            e.onNext(result);
        }
    }).compose(RxUtil.activityLifecycle(this))
            .compose(RxUtil.io())
            .subscribe(new Consumer<Object>() {
                @Override
                public void accept(@NonNull Object o) throws Exception {
                    closeProgressDialog();
                    PayResult payResult = new PayResult((Map<String, String>) o);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, AliPay.PAY_OK)) {//--------->支付成功
                        finish();
                    } else if (TextUtils.equals(resultStatus, AliPay.PAY_FAIL)) {//--------->支付失败
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        ToastUtils.showToast(payResult.getMemo());
                    } else if (TextUtils.equals(resultStatus, AliPay.PAY_CANCEL)) {//--------->交易取消
                        ToastUtils.showToast(payResult.getMemo());
                    } else if (TextUtils.equals(resultStatus, AliPay.PAY_NET_ERROR)) {//---------->网络出现错误
                        ToastUtils.showToast(payResult.getMemo());
                    } else if (TextUtils.equals(resultStatus, AliPay.PAY_REPEAT)) {//------>交易重复
                    }
                }
            });
}

4.回调类

/**
* 支付宝回调code值
*/

public class AliPay {

	public static final String PAY_OK = "9000";//支付宝支付成功
	public static final String PAY_PROCESSING_UNKNOWN = "8000";//正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
	public static final String PAY_FAIL = "4000";//支付宝支付失败
	public static final String PAY_REPEAT = "5000";//支付宝支付重复请求
	public static final String PAY_CANCEL = "6001";//用户中途取消
	public static final String PAY_NET_ERROR = "6002";//网络连接出错
	public static final String PAY_UNKNOWN = "6004";//支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
}


/**
* 支付宝回调
*/

public class PayResult {
	private String resultStatus;
	private String result;
	private String memo;

	public PayResult(Map<String, String> rawResult) {
	    if (rawResult == null) {
	        return;
	    }

	    for (String key : rawResult.keySet()) {
	        if (TextUtils.equals(key, "resultStatus")) {
	            resultStatus = rawResult.get(key);
	        } else if (TextUtils.equals(key, "result")) {
	            result = rawResult.get(key);
	        } else if (TextUtils.equals(key, "memo")) {
	            memo = rawResult.get(key);
	        }
	    }
	}

	@Override
	public String toString() {
	    return "resultStatus={" + resultStatus + "};memo={" + memo
            + "};result={" + result + "}";
	}

	/**
	 * @return the resultStatus
	 */
	public String getResultStatus() {
	    return resultStatus;
	}

	/**
	 * @return the memo
	 */
	public String getMemo() {
	    return memo;
	}

	/**
	 * @return the result
	 */
	public String getResult() {
	    return result;
	}
}

个人博客地址