Foxtable(狐表)用户栏目专家坐堂 → 微信支付,查询订单后处理,有时候会断掉


  共有2801人关注过本帖树形打印复制链接

主题:微信支付,查询订单后处理,有时候会断掉

帅哥哟,离线,有人找我吗?
fubblyc
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
微信支付,查询订单后处理,有时候会断掉  发帖心情 Post By:2019/3/26 6:17:00 [只看该作者]

老师,我这边是查询订单确认成功后才给配置券,现在大部分情况是OK的,就是一天有一两个会配置失败,导致顾客付款成功,实际没有券。看下边标黄色的。


不知道是不是因为网络卡顿的原因,在想是不是要用多进程,用异步函数什么的?
其他没标黄色的可以略过不看,就是查询订单的代码。

如下图,09分的实际是有支付成功的,但是没有填入卡券信息。不知道是不是10分的时候同时有流量进来,是的卡顿了。

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190326062038.png
图片点击可在新窗口打开查看


'查询订单是否正常,存在则返回true
Dim id As String = args(0) 'out_trade_no或者是transaction_id,仿真测试下建议使用out_trade_no
Dim queryType As Integer = args(1) '查询条件,0为out_trade_no,其它值为transaction_id
'用例测试当前订单表,仿真测试的时候发现,刷卡测试查询接口返回的交易类型不是MICROPAY,而是APP,本实例是拿交易类型来做表名称的
Dim tn As String =""
If args.length > 2 Then
    tn = args(2) '刷卡支付用例传入"MICROPAY"
End If
Dim req As WxPayData = Functions.Execute("GetWxPayData")
If queryType = 0 Then '0表示是通过out_trade_no进行查询,适合没有接收到支付结果通知的情况
    req.SetValue("out_trade_no", id)
Else
    req.SetValue("transaction_id", id) '通过transaction_id进行查询,适合接收到支付结果通知的情况
End If
req.SetValue("appid", Vars("appid"))'//公众账号ID
req.SetValue("mch_id", Vars("mchid"))'//商户号
req.SetValue("nonce_str", req.GenerateNonceStr())'//随机字符串
req.SetValue("sign", req.MakeSign())'//签名

Dim url As String = Functions.Execute("GetApiUrl","api_orderquery")

Dim hc As New HttpClient(url)
hc.C
hc.Timeout = 6
hc.Content = req.ToXML
Dim ret As String = hc.GetData()

If ret= "" Then
    Functions.Execute("logtext","订单查询超时没有返回结果.")
    Return False
End If
Functions.Execute("logtext","订单查询结果: " & ret)
Dim result As WxPayData = Functions.Execute("GetWxPayData")
result.FromXml(ret)

If result.GetValue("return_code") = "FAIL" Then
    Functions.Execute("logtext","订单查询失败: " & result.GetValue("return_msg"))
    Return False
End If
Dim dr As DataRow
If tn = "" Then
    tn = result.GetValue("trade_type")
End If

If queryType = 0 Then '0表示是通过out_trade_no进行查询,适合没有接收到支付结果通知的情况
    '  dr = DataTables(tn).Find("out_trade_no='" & id & "'")
    dr = DataTables("公众号支付订单").Find("out_trade_no='" & id & "' ")
Else
    dr = DataTables(tn).Find("transacti")
End If

If dr IsNot Nothing Then
    dr("result_code") = result.GetValue("result_code")
    dr("err_code") = result.GetValue("err_code")
    dr("err_code_des") = result.GetValue("err_code_des")
    dr.save()
End If

If result.GetValue("return_code") = "SUCCESS" AndAlso result.GetValue("result_code") = "SUCCESS" Then
    If dr Is Nothing Then
        '  dr = DataTables(tn).Find("out_trade_no='" & result.GetValue("out_trade_no") & "'")
        dr = DataTables("公众号支付订单").Find("out_trade_no='" & result.GetValue("out_trade_no") & "'")
    End If
    If dr Is Nothing Then
        Functions.Execute("logtext","无此业务订单,out_trade_no= " & result.GetValue("out_trade_no") )
        Return False
    End If
    dr("trade_state") = result.GetValue("trade_state")
    If result.GetValue("trade_state").ToString() = "SUCCESS" Then
        'PopMessage("chaxun:" & id)
        'vars("out_trade_no") = result.GetValue("out_trade_no")
        'vars(id) = id 'id = out_trade_no
        'vars("transaction_id") = result.GetValue("transaction_id")
        'PopMessage("chaxun:" & vars(id))
        
        vars(dr("openid")) = result.GetValue("transaction_id")
        dr("transaction_id") = result.GetValue("transaction_id")
        dr("trade_type") = result.GetValue("trade_type")
        dr("total_fee") = result.GetValue("total_fee")
        dr("cash_fee") = result.GetValue("cash_fee")
        dr("time_end") = Date.ParseExact(result.GetValue("time_end"),"yyyyMMddHHmmss",System.Globalization.CultureInfo.InvariantCulture)
        dr("trade_state_desc") = result.GetValue("trade_state_desc")
        
        If req.IsSet("settlement_total_fee") Then
            dr("settlement_total_fee") = req.GetValue("settlement_total_fee")
        End If
        If req.IsSet("coupon_fee") Then
            dr("coupon_fee") = req.GetValue("coupon_fee")
        End If
        
        
        
        Dim dr1 As DataRow = DataTables("预售下发券号").sqlfind("发送状态 = '0' and product_id = '" & dr("product_id") & "'")
        Dim qh1 As String = dr1("券号1")
        Dim qh2 As String = dr1("券号2")
        Dim qh3 As String = dr1("券号3")
        Dim qh4 As String = dr1("券号4")
        Dim qh5 As String = dr1("券号5")
        Dim qh  As String = dr1("券号")
        Dim cardid1 As String = dr1("卡券ID1")
        Dim cardid2 As String = dr1("卡券ID2")
        Dim cardid3 As String = dr1("卡券ID3")
        Dim cardid4 As String = dr1("卡券ID4")
        Dim cardid5 As String = dr1("卡券ID5")
        Dim cardid As String = dr1("卡券ID")
        
        dr("卡券ID1") = cardid1
        dr("卡券ID2") = cardid2
        dr("卡券ID3") = cardid3
        dr("卡券ID4") = cardid4
        dr("卡券ID5") = cardid5
        dr("卡券ID") = cardid
        dr("券号1") = qh1
        dr("券号2") = qh2
        dr("券号3") = qh3
        dr("券号4") = qh4
        dr("券号5") = qh5
        dr("券号") = qh
        dr.Save
        
        dr1("发送状态") = "1"
        dr1.save()        
    Else
        Return False
    End If
    Return True
End If
Return False
[此贴子已经被作者于2019/3/26 6:20:44编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111414 积分:567140 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/3/26 9:13:00 [只看该作者]

建议使用异步函数处理

 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2019/3/26 9:40:00 [只看该作者]

蓝老师,我后面发现,原来不是在配置卡券的时候断,是在下单的步骤就断了。


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190326093828.png
图片点击可在新窗口打开查看

可能是差不多时间并发,导致后一个压根就没有下单,在FT系统里没有增加行

那是不是就在这个环节异步函数呢?还是说从提交订单开始就异步呢?

哈哈,异步函数还没弄过,得好好研究下

'统一下单
Dim openId As String = Args(0) '参数一,用户公众号ID,JSAPI模式必须
Dim productId As String = Args(1) '参数二,业务订单id
Dim trade_type As String = Args(2) '参数三,下单类型:JSAPI--公众号支付?NATIVE--原生扫码支付?APP--app支付
Dim total_fee As Integer = Args(3) '参数四,支付金额
Dim ddbh As String = Args(4) '参数五,订单编号
'PopMessage(openID)
Dim req As WxPayData = Functions.Execute("GetWxPayData")
req.SetValue("body", "充500元变1000元")

'Dim dr As DataRow = DataTables(trade_type).Find("product_id='" & productId  & "'")
Dim dr1 As DataRow = DataTables("公众号支付订单").AddNew()



[此贴子已经被作者于2019/3/26 9:42:35编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/3/26 9:45:00 [只看该作者]

如果没有用异步函数,每一个请求,都会排队执行的。而微信那边有响应时间的限制的,如果超时,就会操作失败。

 

所以,尽量用异步函数


 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2019/3/26 9:57:00 [只看该作者]

恩恩,甜老师,不是没有增加行,是跑到后面去了,说明FT的处理没有问题,在排队,所以到后面了,

而正如你说的微信有时间限制,超时了。


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20190326095738.png
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2019/3/26 12:44:00 [只看该作者]

1、没看懂你截图的意思。

 

2、如果多个请求发送到foxtable,如果没有用异步,就会先执行一个,完成后再执行另一个的。


 回到顶部