最近公司有一个应用,用户可以在微信公众号上面下单,也可以在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 中提高支付的可靠性的更多相关文章

  1. 微信APP支付V3版本签名 && APP下单/订单查询接口Python版实现

    问题背景 最近接入微信支付,微信官方并没有提供Python版的服务端SDK,因而只能根据文档手动实现一版,这里记录一下微信支付的整体流程.踩坑过程与最终具体实现. 微信支付APP下单流程 根据微信官方 ...

  2. APP中的第三方“支付”功能测试建议

    目前市场上APP中带有支付功能的产品有非常多,那么APP中带有第三方支付功能的产品在这一模块该如何测试才尽可能的确保测试完整性. 正常流程: 正常使用支付宝.微信.银行卡(目前使用最多的第三方支付方式 ...

  3. Python3+Django2集成PayPal(贝宝)跨境支付三方接口以及订单查询和退款业务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_157 如果您所在的公司涉及外贸或者跨境支付业务,那一定听说过大名鼎鼎的PayPal,总的来说,PayPal在跨国贸易里的优势还是比 ...

  4. 微信支付v2开发(5) 订单查询

    本文介绍微信支付中订单查询功能的实现. 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/wxpay-order-query.html 一.订单查询 因为某一方 ...

  5. 微信支付 统一订单 $order = WxPayApi::unifiedOrder($input); 断点调试

    定位至 CODE /** * 将xml转为array * @param string $xml * @throws WxPayException */ public static function I ...

  6. C# 微支付退款查询接口 V3.3.6

    #region 微支付退款查询 string Nonce = CreateRandomCode(15).ToLower(); //生成15个随机字符string sign1 = "appid ...

  7. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

  8. 支付宝sdk 支付订单查询失败

    最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败.后来我怀疑是支付宝的问题,想都不用想是支付宝的问题. 但是自己根本你无法复现,因为我发现支付宝支付完成之后 ...

  9. ping++微信渠道,第二次拉起不能进行支付返回订单号重复问题

    项目中用到了支付功能,采用的是ping++实现的,上线运行一年多都很正常,但是最近突然出现有买家反映说不能进行支付的情况 通过了解和沟通之后发现发现是重复拉起失败,然后我们对问题进行了排查. 测试过程 ...

随机推荐

  1. Excel 常用属性的一小部分

    1.由于工作需要,最近积累了一些Excel中的相关知识,特此记录 Workbooks xlbooks = xlApp.Workbooks; Workbook xlbook = xlbooks.Add( ...

  2. vim 加密(crypt)文本文档

    算法 vim7.3版本支持两种加密方式——PKzip算法(已知有缺陷的).Blowfish算法(从7.3版本开始支持).Blowfish2算法(从7.4.399版本开始支持)而vim -x 默认采用P ...

  3. 利用 SPICE 分析理解心电图前端中的右腿驱动

      [导读] 心电图(ECG)学是一门将心脏离子去极(ionic depolarization) 后转换为分析用可测量电信号的科学.模拟电子接口到电极/患者设计中最为常见的难题之一便是优化右腿驱动 ( ...

  4. Struts功能详解——ActionMapping对象

    Struts功能详解——ActionMapping对象 ActionMapping描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过pat ...

  5. [LeetCode&Python] Problem 235. Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  6. MySQL 规范

    一.数据库命令规范 二.数据库基本设计规范 三.数据库字段设计规范 四.索引设计规范 五.常见索引列建议 六.如何选择索引列的顺序 七.避免建立冗余索引和重复索引 八.优先考虑覆盖索引 九.索引SET ...

  7. 自动化测试_Mac安装python+selenium

    1.下载安装(参照下文) https://blog.csdn.net/kacylining/article/details/60587484 https://www.zhihu.com/questio ...

  8. java jdk jre

    Java11新特性: https://www.cnblogs.com/eric-shao/p/10025180.html java的一些基本概念——java11.jdk.jre.jvm: https: ...

  9. [双系统linux] ----双系统切换导致系统时间错误

    安装了linux双系统以后,发现每次双系统切换以后系统时间总会错误. 原因:Linux和win7(win10)双系统时间错误问题 时间相差8小时 MAC/linux 将系统硬件时间看待为UTC, 即U ...

  10. mac电脑上如何启动mysql

    export PATH=$PATH:/usr/local/mysql/bin/   mysql -uroot -p