app接入支付宝支付功能详解以及坑

app接入第三方支付之支付宝教程 支付宝开放文档链接

这里我们就说一些细节问题

首先我们下载好支付宝sdk然后直接导入到我们项目中就可以了,这一步操作就不多说了。

这里是我封的一个支付方法返回的是一个Message对象,需要传进去一个订单号。这样封一下是为了我们调用支付的时候方便调用。
我们支付宝与微信不同,支付宝是支持沙箱环境的,当我们需要特别主要这句代码,EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); 如果你使用沙箱环境就添加这句代码,如果你是正式环境那么就注释掉这句代码,否则调用的话会出问题,当然还有注意的是如果你移动这边开启了沙箱环境那么相应后台返回的参数也有相应的改变。所以这里需要你和后台沟通好你们是什么环境,如果是沙箱则统一沙箱,如果是正式则统一正式。

 public Message create(Activity activity){
        //沙箱环境
        //EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
        WeakReference<Activity> wr = new WeakReference<Activity>(activity);
        PayTask alipay = new PayTask(wr.get());
        Map<String, String> result = alipay.payV2(out_trade_no, false);

        Message msg = new Message();
        msg.what = 1;
        msg.obj = result;
        return msg;
    }

我们拿到msg对象后直接异步调用,这里一定要开启一个子线程哦,然后发送信息就可以了,接下来app就会唤起支付宝,剩下的就是接收回调。

Model.getInstance().getGlobalThreadPool().execute(new Runnable() {
                                @Override
                                public void run() {
                                    handler.sendMessage(new ZFBPayUtils(prepayid).create(activity));
                                }
                            });

我们也来看一下官方给出的调用代码与我给出的相互比较理解一下,写法不同但逻辑是一样。

final String orderInfo = info;   // 订单信息
		Runnable payRunnable = new Runnable() {
			@Override
			public void run() {
				PayTask alipay = new PayTask(DemoActivity.this);
                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();

#####支付宝回调
这里需要注意一点上面我们在子线程中用了一个Handler对象,那么这个Handler对象在哪里来的,那么答案就是这里,一定要使用这个对象,否则接收不到回调。 这里如果返回的状态码是9000那么表示支付成功,否则就是支付失败,支付失败各自做相应处理。我这里支付宝失败是关闭之前的活动,打开了一个新的订单活动。这里是用了一个活动管理框架,方便关闭我想要关闭的活动。活动关闭则框架不会保持此活动的引用。

private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    //支付宝支付回调
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        //System.out.println("成功");
                        OrderQuery(orderid);
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。					........
						AppManage.getInstance().clearActivitys("TouristsDetailsActivity","TouristsOrderFormActivity");
                    }
                    break;
            }
        }
    };

以上就是整个支付流程了。那么这里再强调一个问题就是订单号,如果你去看官方文档那里会有一堆一堆的参数支付宝请求参数,但是如果你是移动端开发的,你看一下就可以了,不需要去管参数,所有参数都由后台计算好,移动端直接拿到订单号调用支付宝即可。

最后简单说一下整个的支付逻辑,所有请求参数比如appId这些必须放在后台处理,所以订单号的计算也由后台承担了,这也是为了安全考虑。其次就是我们的一个支付验证了,当你移动端支付成功的时候,你移动端会接到一个支付宝成功回调,后台也会,那么这个时候你不要以你移动端收到的支付宝成功为准,应该当你移动端支付成功回调以后再去请求后台询问是否支付成功,如果返回成功则此次支付才算成功,否则有一次失败则算失败处理。其次退款移动端只需要发送相应请求即可,具体退款逻辑由服务器负责,你只需要告诉他哪个订单需要退款即可。
当然你也不要怕,万一你移动端支付成功,后台不知道,但是他真的支付成功了,他钱就没了,这个小概率问题,第一你可以联系你家客服解决,因为支付宝那边是由账单的,第二你也可以让你的服务器去同步账单检查相应的支付记录,进行退款操作,不过一般选择第一种,毕竟是很小概率事件。

喜欢就点的赞吧,谢谢。下期更新微信接入指南。

发布了21 篇原创文章 · 获赞 4 · 访问量 1637

猜你喜欢

转载自blog.csdn.net/weixin_41078100/article/details/104518938
今日推荐