第三方支付自动回调(第三方支付怎么弄)

http://www.itjxue.com  2023-01-28 04:44  来源:未知  点击次数: 

订单失效了,第三方支付却推来了支付成功的消息,你遇到过吗?

背景

一大早运营报来了一个问题:

问题描述:有一个订单客户支付成功了,订单状态却显示过期。

预期:客户应该支付不了失效的订单。

问题猜想:1 是处理回调通知时,程序处理错误导致修改订单状态不成功。

2 用户停留在支付宝的支付时间过长,导致过了订单失效期后,进行了支付。

作为程序开发者,其他的问题都是小问题,但是遇到支付问题就是大问题,大家都懂得,于是开始紧急排查。

问题排查

查看错误日志,果然找到了该订单已过期的信息,说明问题应该是问题2。

找到订单相应的支付回调通知参数,果然找到第三方支付的成功通知。

解决方案1

预支付时设置过期时间

微信支付订单过期参数: time_expire

支付宝支付订单过期参数:time_expire

温馨提示: 在排查时,看到同事写的支付代码里传了time_express , 这个不代表我们的订单过期时间,代表的是用户正确输入密码支付宝受理这笔订单业务开始计时时间,千万不要混淆了 。

聪明的细致的你肯定想到了,还需要做一步服务器时间和第三方支付系统的服务器时间校验,不然可能出现不准的情况。

校验服务器时间和标准时间

需要关注delta,就是NTP服务时间和本地时间的差值。

如果相差较大可以同步服务器时间,这种方式是最简单的:

实际操作大家可以用一个定时任务,每天去同步一次。

解决方案2

如果你的服务器比较多,并且同步时间会存在风险,或者你没有操作正式服务器的权限,那么可以在自己处理失效订单时,主动通知给第三方系统你的订单已经失效。

微信调用 closeorder 方法

支付宝调用

比较2种方案的优劣

1 第一种方案的优点是,代码量少,只需要多添加一个参数即可。缺点是可能存在时间不准。

2 第二种方案优点,可以保证订单失效时的决定时间。缺点代码量稍微大些。

感悟

通过这个问题,我们可以看到,很多问题都有多种解决方案,当身处不同位置时,解决方案不同,需要我们自己权衡方案的利弊找出最优方案。如果大家有更好的解决方案,欢迎大家留言与评论。

演示视频

视频加载中...

iOS开发-跳转第三方支付遇到的小问题

1.首先是最常见的微信订单号重复的问题,这里做的操作就是在拿到服务器的订单号之后,APP端随机在后边追加两个字符串,这样就可以避免这个问题.

2.如果服务器生成的订单号过长的话也会调起失败,返回:订单号长度错误.

3.第三个问题相对于前两个来说比较隐蔽,刚跳转到第三方支付之后,不在第三方如:微信,支付宝做任何操作,然后通过双击home键或者点击左上角的方式返回自己的应用,这时候是收不到任何的回调,这样造成的结果就是程序界面仍然停留在收银台页面,这样用户继续点击就会造成重复下单的BUG,是一个比较麻烦的问题.初步想到的解决办法即时性的都不能解决.最后想到了一个稍微讨巧的办法,首先如果这个程序是通过支付跳转到第三方的,就加一个布尔值apinPayGO,当程序从后台进入前台时就发出通知,.经过实际测试,支付的回调实在系统的运行方法之后的,收银台页面在接收到该通知之后,延迟一秒执行方法,判断系统这次从后台进入前台是否经过了支付第三方的回调方法,如果经过了支付第三方的回调方法就不做任务操作,如果没经过第三方的回调方法,证明用户在跳转到第三方时没做任务操作,直接通过iOS系统返回到自己的应用了,这里就把页面跳转到待支付页面,然后开始倒计时!

- (void)applicationWillEnterForeground:(UIApplication*)application{

NSLog(@"EnterForeground");

if(self.apinPayGO) {

NSNotificationCenter*center = [NSNotificationCenterdefaultCenter];

[centerpostNotificationName:@"payReturn"object:nil];

}

}

4.创建订单,支付中间的时间控制问题.

用户点击创建订单,服务器设置一个超时时间十分钟,需要用户在十分钟内完成支付,直接去操作是没什么问题.但是如果不直接操作,第三方的支付超时时间跟服务器订单储存的超时时间不同步,可能出现的情况就是:服务器这边订单已经失效了,但是第三方支付仍可以支付,出现bug.有个预想的处理方法是:支付前进行查询订单操作,服务器返回一个超时时间,然后进行第三方支付时把这个超时时间设置过去.但是在做的过程中又遇到了新的问题:第三方支付的超时时间有限制,支付宝是1min~15d,微信是要大于五分钟.

解决方案: 创建订单 跟调第三方支付创建订单 同时进行,然后第一次支付的时候设置超时时间.

h5+ app 第三方支付调用步骤

1 在页面onload中获取支付通道,支付的时候再获取支付通道会浪费用户等待时间:

// 获取支付通道 (微信支付宝)

var wxChannel,aliChannel;

plus.payment.getChannels(function(channels) {

for(var i in channels) {

if(channels[i].id == "wxpay") {

wxChannel = channels[i];

} else {

aliChannel = channels[i];

}

}

}, function(e) {

mui.toast("获取支付通道失败:" + e.message);

});

2 调起后台支付接口 ,传参 userId , log_id , type , pay_pass,后台处理成功返回支付金额(如果是余额支付到这一步就支付成功结束了)?

3 调起支付 :

//channel 支付通道类型(wxpay/alipay), pay 支付金额

plus.payment.request(channel,pay,function(result){

//支付成功回调......

},function(error){

//取消/支付失败回调......

});

Android微信第三方登录/支付,没有走回调

1、要正式签名的apk,使用debug包貌似无法调动微信

2、清单文件中要注册微信回调

activity

android:name=".wxapi.WXEntryActivity"

android:exported="true"

android:label="@string/app_name"

android:launchMode="singleTop"

android:theme="@android:style/Theme.Translucent" /

3、回调的类名,一定要是官网的WXEntryActivity.java。这里很迷,我之前名字是WXPayEntryActivity,因为之前使用了微信支付,就起了这个名字,后续又加入了微信分享,也没有问题,当我又加入微信登录之后,就不走回调了,改成WXEntryActivity.java成功走了回调。

4、回调类所在包名,一定要是wxapi:

.wxapi.WXEntryActivity

(责任编辑:IT教学网)

更多

推荐Dreamweaver教程文章