思路:十分简单,调用支付宝提供的官方方法,搞定。
第一步:
下载支付宝官方的sdk,导入项目中:https://docs.open.alipay.com/54/104509
(忽略adapter-rxjava-2.0.0-beta3.jar这个包,与支付无关)
第二步:加入build.grade中
compile files('libs/alipaySdk-20180601.jar')
(注意包的时间,必须鱼libs下相对应)
第三步:调用支付宝方法,payV2()是重点:
Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(HospitalYmOrderDetailActivity.this); // String result = alipay.payV2(orderInfo,true); Map<String, 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();其中payV2的两个参数orderInfo,true,都不用我们管,orderInfo是服务器生成的,true写死就可以,官方解释true: 用户在商户app内部点击付款,是否需要一个loading做为在钱包唤起之前的过渡,这个值设置为true,将会在调用pay接口的时候直接唤起一个loading,直到唤起H5支付页面或者唤起外部的钱包付款页面loading才消失。(建议将该值设置为true,优化点击付款到支付唤起支付页面的过渡过程。)
到此成功。
给出Handler和它用到的一个实体类代码:
Handler:
private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { @SuppressWarnings("unchecked") PayResult payResult = new PayResult((Map<String, String>) msg.obj); /** 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为9000则代表支付成功 if (TextUtils.equals(resultStatus, "9000")) { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 Toast.makeText(HospitalYmOrderDetailActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(HospitalYmOrderDetailActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); } break; } default: break; } }; };
payResult:
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; } }