利用微信支付的订单查询接口可以在APP 中提高支付的可靠性
最近公司有一个应用,用户可以在微信公众号上面下单,也可以在APP 中下单。
当用户在公共号上面下单时,微信支付成功可以返回微信支付单号,但是在APP 中用户微信支付时,个别时候会出现用户已经付款成功,却没有执行订单支付成功后的回调逻辑(比如修改业务系统中的订单状态为已付款).
显然在APP中微信支付的这种回调逻辑是不可靠的。
(1)首先说明下为什么要拿到微信支付订单号
微信支付订单号是微信系统在支付成功后返回的订单号,比如这样的订单号:4007322001201705049543255213, 拿到这个订单号可以调用微信查询接口(当然也可以使用自己应用中定义的订单号来调用微信订单查询接口,但是微信推荐优先使用这个微信支付订单号来查询)
,更重要的是,在实际的业务逻辑中,有些用户下单成功后,后来要求退款(比如收到货后用户不满意,要求订单退款),这样在调用微信的退款接口(https://api.mch.weixin.qq.com/secapi/pay/refund)时,必须要提供这个微信支付订单号。
(2)APP 中的微信支付如何提高微信支付的可靠性
这个主要就是用户在APP 中使用微信支付时,每当支付成功后,在执行的回调逻辑(比如是这样的逻辑:往自己的系统里面修改订单状态为已支付,发送支付成功的通知消息等)前,调用微信提供的订单查询接口(https://api.mch.weixin.qq.com/pay/orderquery),仅当这个订单查询接口返回该笔订单已经支付成功(主要是trade_state="SUCESS"),则才执行后面的回调逻辑。
/// <summary>
/// 调用微信支付的查询订单接口,以确认是否订单已经支付成功
/// </summary>
/// <param name="entity"></param>
/// <param name="loggingSessionInfo"></param>
/// <param name="OrderID"></param>
/// <param name="ChannelID"></param>
/// <param name="WeixinTransactionID"></param>
/// <returns></returns> private bool CheckIfOrderPaid(OrderEntity entity, LoggingSessionInfo loggingSessionInfo, string OrderID, string ChannelId, ref string WeixinTransactionID) { WxPayData inputObj = new WxPayData(); // APP 中的微信支付(paymentcenter_id值为空), 根据业务系统中的订单号out_trade_no 来调用微信的订单查询接口,以确认是否该订单已经支付成功 if (string.IsNullOrEmpty(entity.paymentcenter_id)) { var common = new CommonBLL(); // APP 中使用微信支付时,微信系统设定的APP 相关账户信息(partner,partnerkey) AccessTokenEntity wxInfo = common.GetAppInfo(loggingSessionInfo); inputObj.SetValue("out_trade_no", OrderID); // 调用微信的订单查询接口 WxPayData result = WxPayApi.OrderQuery(inputObj, wxInfo.AppID, wxInfo.Partner, wxInfo.Partnerkey); if (!result.IsSet("trade_state") || result.GetValue("trade_state").ToString() != "SUCCESS") { return false; } WeixinTransactionID = result.GetValue("transaction_id").ToString(); } else { // 微信公众号支付 if (!string.IsNullOrEmpty(WeixinTransactionID)) { inputObj.SetValue("transaction_id", WeixinTransactionID); } else { inputObj.SetValue("out_trade_no", entity.paymentcenter_id); } // 获取微信公众号的相关账户信息(MerchantID,SignKey,APPId等) TPaymentTypeCustomerMappingEntity[] mappings = new TPaymentTypeCustomerMappingBLL(this.CurrentUserInfo).QueryByEntity( new TPaymentTypeCustomerMappingEntity() { ChannelId = ChannelId, CustomerId = entity.customer_id } , null ); // 调用微信支付查询接口,这次inputobj 的取值要么是微信系统的transaction_id(微信推荐使用transaction_id 来查询订单),要么是我们自己业务系统的订单号(out_trade_no)。 WxPayData result = WxPayApi.OrderQuery(inputObj, mappings[].APPId, mappings[].MerchantID, mappings[].SignKey); if (!result.IsSet("trade_state") || result.GetValue("trade_state").ToString() != "SUCCESS") { return false; } } return true; }
(3)更多详细的微信订单查询接口,可以参考如下的微信官方链接:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4
利用微信支付的订单查询接口可以在APP 中提高支付的可靠性的更多相关文章
- 微信APP支付V3版本签名 && APP下单/订单查询接口Python版实现
问题背景 最近接入微信支付,微信官方并没有提供Python版的服务端SDK,因而只能根据文档手动实现一版,这里记录一下微信支付的整体流程.踩坑过程与最终具体实现. 微信支付APP下单流程 根据微信官方 ...
- APP中的第三方“支付”功能测试建议
目前市场上APP中带有支付功能的产品有非常多,那么APP中带有第三方支付功能的产品在这一模块该如何测试才尽可能的确保测试完整性. 正常流程: 正常使用支付宝.微信.银行卡(目前使用最多的第三方支付方式 ...
- Python3+Django2集成PayPal(贝宝)跨境支付三方接口以及订单查询和退款业务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_157 如果您所在的公司涉及外贸或者跨境支付业务,那一定听说过大名鼎鼎的PayPal,总的来说,PayPal在跨国贸易里的优势还是比 ...
- 微信支付v2开发(5) 订单查询
本文介绍微信支付中订单查询功能的实现. 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/wxpay-order-query.html 一.订单查询 因为某一方 ...
- 微信支付 统一订单 $order = WxPayApi::unifiedOrder($input); 断点调试
定位至 CODE /** * 将xml转为array * @param string $xml * @throws WxPayException */ public static function I ...
- C# 微支付退款查询接口 V3.3.6
#region 微支付退款查询 string Nonce = CreateRandomCode(15).ToLower(); //生成15个随机字符string sign1 = "appid ...
- 利用MyBatis的动态SQL特性抽象统一SQL查询接口
1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...
- 支付宝sdk 支付订单查询失败
最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败.后来我怀疑是支付宝的问题,想都不用想是支付宝的问题. 但是自己根本你无法复现,因为我发现支付宝支付完成之后 ...
- ping++微信渠道,第二次拉起不能进行支付返回订单号重复问题
项目中用到了支付功能,采用的是ping++实现的,上线运行一年多都很正常,但是最近突然出现有买家反映说不能进行支付的情况 通过了解和沟通之后发现发现是重复拉起失败,然后我们对问题进行了排查. 测试过程 ...
随机推荐
- code about led_shake
//write by:cyt //Project Name:Led on/off //Time:2017-2-10 #include<reg51.h> void delay(int c) ...
- nginx 配置本地https(免费证书)
Linux系统下生成证书 生成秘钥key,运行: $ openssl genrsa -des3 -out server.key 20481会有两次要求输入密码,输入同一个即可 输入密码 然后你就获得了 ...
- Classnotfoundexception 与 noClassDelfaultError的区别
ClassNotFoundException 这个异常特别常见,就是class找不到异常,一般的问题就是: 1 调用class的forName方法时,找不到指定的类 2 ClassLoader 中的 ...
- python 2.7和3.7都支持的情况 bit_length() pycharm 更改解释器
1.头部加: #!/usr/bin/env python # -*- coding:utf-8 -*- 2.bit_length() :当前数值为二进制时,至少要用多少为表示 a = 5 b = ...
- 获取choice的value
- python基础分享
# 一.变量命名规范 # 1.数字 字母 下划线 组成 # 2.不能数组开头和纯数字 # 3.不能用python相关关键字 # 4.不要用中文 # 5.要有意义 # 6.不要太长 # 7.区分大小写 ...
- leetcode 813. Largest Sum of Averages
对于一个数组中的数进行分组,取每个组里的平均值进行加和的. 使用动态规划,其中dp[i][k]表示以i为结尾的有k个分组的,那么递推式为: dp[i][k]=dp[j][k-1]+(sum[i]-su ...
- 输入框VS软键盘
最近在做一个h5的时候遇到的问题 我们都知道当页面上的有输入框被选中了,这个时候就回调出键盘用户可以输入.但是安卓手机在弹出键盘时页面的输入框也会被覆盖住: 以下为暂时的解决办法:(以下方法同时解决了 ...
- Python变量和常量
1.什么是变量 变量:核心在于变和量儿字,变->变化,量->状态如何定义? x=1 变量名 变量赋值符号:= 变量值:1 其中变量名又称为标识符: 1. 可以是字母,数字,下划线的任意组合 ...
- 【步步为营 Entity Framework+Reporting service开发】-(2) Code Fir
也许有人问,为什么要用EF创建爱你数据表,code first好处是什么? 使用EF创建数据库/表,只需要设计简单的C#类,再表内容变化的时候他会自动更新数据库结构,并且保留原有数据. EF很强大,支 ...