C#完成JSAPI支付(二)

微信支付回调通知


一、提要


接上一篇文章,JSAPI支付完成之后,会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。

二、准备资料


  • JSAPI支付中,调用微信统一下单接口中配置了notify_url参数

  •   参考微信文档【回调通知注意事项】

在微信回调通知注意事项中,微信有以下提示信息:

  1. notify_url需要填写商户自己系统的真实地址,不能填写接口文档或demo上的示例地址。 
  2. notify_url必须是以https://或http://开头的完整全路径地址,并且确保url中的域名和IP是外网可以访问的,不能填写localhost、127.0.0.1、192.168.x.x等本地或内网IP。 
  3. notify_url不能携带参数。 

   更多注意事项,请参考微信文档:

   https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_8&index=6

  •   参考微信文档【支付结果通知】

     注意事项:

  1. 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
  2. 后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起多次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功。
  3. 在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【查询订单API】确认订单状态。

      特别提醒:

  1. 商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
  2. 当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
  3. 技术人员可登进微信商户后台扫描加入接口报警群,获取接口告警信息。

     更多参考信息,请参照文档:

     https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8

三、代码开发

   请注意,微信的支付结果通知,由于需要提交数据流,所以请求方式为:Post。

 //请注意,一定要在方法体头部加入Post请求标识
 [HttpPost]
 public string SyUnifiedorderUrl()

  接收Xml文件流

string strRecieveBody;
using (System.IO.StreamReader streamReader = new System.IO.StreamReader(Request.Body))
{
     strRecieveBody = streamReader.ReadToEnd();
    //方面我们更好的处理该Xml文件,建议使用日志打印该文件流结果
 }

 建议将xml转换为对象或者Dictionary<string, string>对象以方便我们更好的处理,由于微信通知返回的字段过于繁杂,并且很多字段其实都无关业务数据处理,所以,在此在建议各位将返回结果转换为Dictionary<string, string>。

public IDictionary<string, string> FromXml(string xml)
{
     IDictionary<string, string> xmlDic = new Dictionary<string, string>();
     if (string.IsNullOrEmpty(xml))
     {
         return xmlDic;
     }

    XmlDocument xmlDoc = new XmlDocument();
    // 2018/07/06 关于XML解析存在的安全问题指引.Net回调修复
    xmlDoc.XmlResolver = null;
    xmlDoc.LoadXml(xml);
    XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
    XmlNodeList nodes = xmlNode.ChildNodes;
    foreach (XmlNode xn in nodes)
    {
        XmlElement xe = (XmlElement)xn;
        xmlDic[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
    }
    return xmlDic;
}

  针对该返回结果,我们需要着重处理的字段如下:

  return_code:返回状态码,SUCCESS/FAIL;交易是否成功需要查看result_code来判断。

  sign:签名,我们需要对数字签名进行验证,防止数据泄漏导致出现“假通知”,我们可以使用

  out_trade_no:商户订单号,我们可根据该字段查询我们数据库中的订单,然后再进行业务处理。

  total_fee:订单总金额,我们可根据该字段校验,我们发起支付的金额与用户实际支付金额是否一致

  等这一切都校验完成,一整套jsapi支付才算结束。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值