zoukankan      html  css  js  c++  java
  • 微信JSAPI支付回调

    在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

    在经历了千幸万苦之,填完了所有的JSAPI支付的坑后(微信JSAPI支付 跟 所遇到的那些坑),好不容易调起了微信支付接口,看到了亲爱的支付页面,支付成功后发现自己还有个叫做微信回调的忘了处理,内心一万只草泥马在狂奔中。

    首先:

    检查在统一下单的时候,通知地址是否填写正确。

    接收微信支付异步通知回调地址也是有要求:通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

    在微信支付开发,支付结果通用通知介绍说明页面→https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3。

    说明了:支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

    一开始我是蒙逼的,不知道这个是要用页面来做还是用一般处理程序来弄,回调回来后,更新支付状态,然后做应答,啥应答,我要咋应答??what??

    而且如果如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

    意味着,有可能用户支付成功了,微信也不能保证通知成功。

    如果我不做出应答微信会重新发起通知,回调支付成功页面。

    还有个坑是 注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

    所以说,在微信回调时候,还要判断这个订单是否回调过,并成功了。

    这个回调页面的地址不能泄露哦,防止恶意虚假有人模拟微信回调,出现“假通知”,造成资金损失。

    在看完微信的官方文档后,以及各种搜索后,开始了微信支付回调的处理。

    (1)在微信支付授权目录下新建一个aspx页面作为微信回调页面。

    (2)代码

                string returnResutStr = "";
                try
                {
                    Logger.Info("微信支付回调进入页面");
    
                    #region 获取参数值 根据需要解析对应的参数
                    ResponseHandler resHandler = new ResponseHandler(null);
                    string result_code = resHandler.GetParameter("result_code");//业务结果
                    string return_code = resHandler.GetParameter("return_code");//返回状态吗
                    string out_trade_no = resHandler.GetParameter("out_trade_no");//商户订单号
                    string WEXIN_OPENID = resHandler.GetParameter("openid");//微信openid
                    string transaction_id = resHandler.GetParameter("transaction_id");//微信支付单号
                    #endregion
    
                    if (result_code == "SUCCESS" && return_code == "SUCCESS") //验证 是否 微信 回调
                    {
                        #region 日志处理
    
                        Logger.Info("微信支付回调,验证成功,订单号:" + orderno);
    
                        #endregion
                       
                        #region 验证成功 逻辑处理
    if (//判断是否为真实订单){
    //更新支付状态 if (fals) //更新支付状态成功 { #region 日志处理 Logger.Info("微信支付回调更新订单支付状态,更新订单支付状态成功,订单号:" + orderno); #endregion returnResutStr ="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; } else //更新支付状态失败 { #region 日志处理 Logger.Info("微信支付回调更新订单支付状态,更新订单支付状态失败,订单号:" + orderno); #endregion returnResutStr ="<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>"; } } else { Logger.Info("微信支付回调更新订单支付状态,查无此单,订单号:" + out_trade_no); } #endregion } else //微信回调失败 { #region 日志处理 Logger.Error("微信支付回调更新订单支付状态,验证失败,回调参数是非法的"); #endregion returnResutStr ="<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>"; } } catch (Exception exception) { #region 添加错误日志 Logger.Error("微信支付回调更新订单支付状态,出现异常:" + exception.Message + ",堆栈:" + exception.StackTrace); #endregion returnResutStr = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[error]]></return_msg></xml>"; } Response.Write(returnResutStr);

    returnResutStr 就是返回的应答。

    一开始,支付成功后,仔细检查回调地址没问题。可是微信回调一直没有进入页面,日志也没有记录到有回调进入界面。

    后来发现这个回调页面继承了基类,把回调地址拦截。我这个大傻逼。

    参考:

    微信开发文档之支付结果通用通知:

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

  • 相关阅读:
    Scramble String
    Burst Balloons
    Coins in a Line III
    maven初识
    Java类加载器初识
    HTTP协议
    Map和Set的联系
    Thread类与Runnable接口
    Throwable和Exception的区别
    SpringMVC的@ResponseBody注解简介
  • 原文地址:https://www.cnblogs.com/huangenai/p/6349869.html
Copyright © 2011-2022 走看看