C# 微信支付回調驗簽處理的實現

概述

在微信支付中,當用戶支付成功後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。接收微信支付異步通知回調地址也是有要求:通知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。

說明瞭:支付完成後,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。

c#方法

微信支付完成後會有一個支付回調頁面,處理支付完成後的事件,V3支付回調的數據形式為XML格式。

1、定義一個model類,處理一般構造函數,用於解析XML對象;

   #region  WeiXin APP
                    // Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");
                    WxPayData data = new WxPayData();
                    //data.SetValue("attach", model.Dowhere);//附加數據
                    data.SetValue("body", model.Title);//商品描述
                    data.SetValue("out_trade_no", model.LocalTransationNo);// WxPayApi.GenerateOutTradeNo());//隨機字符串
                    data.SetValue("total_fee", Convert.ToInt32(model.Amount * 100));//總金額
                    data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時間
                    data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易結束時間                                                                              //data.SetValue("goods_tag", "goods_tag");//商品標記
                    data.SetValue("trade_type", "APP");//交易類型
                                                       //data.SetValue("product_id", model.ProductId);//商品ID
                    WxPayData r = WxPayApi.UnifiedOrder(data);//調用統一下單接口
                    string prepay_id = r.GetValue("prepay_id").ToString();

                    WxPayData da2 = new WxPayData();
                    da2.SetValue("appid", WxPayConfig.APPID);//公眾賬號ID
                    da2.SetValue("noncestr", WxPayApi.GenerateNonceStr());//商戶號
                    da2.SetValue("package", "Sign=WXPay");//商品描述
                    da2.SetValue("partnerid", WxPayConfig.MCHID);// WxPayApi.GenerateOutTradeNo());//隨機字符串
                    da2.SetValue("prepayid", prepay_id);//總金額
                    da2.SetValue("timestamp", WxPayApi.GenerateTimeStamp());//交易起始時間

                    #endregion

2、檢查支付結果中transaction_id是否存在

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

            WxPayData notifyData = (new Com.WeiXin.Notify(this.HttpContext)).GetNotifyData();

            //檢查支付結果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,則立即返回結果給微信支付後臺
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付結果中微信訂單號不存在");
                Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
                HttpContext.Response.Write(res.ToXml());
                HttpContext.Response.End();
            }

            string transaction_id = notifyData.GetValue("transaction_id").ToString();

3、查詢訂單,判斷訂單真實性

            //查詢訂單,判斷訂單真實性
            if (!QueryOrder(transaction_id))
            {
                //若訂單查詢失敗,則立即返回結果給微信支付後臺
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "訂單查詢失敗");
                Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
                HttpContext.Response.Write(res.ToXml());
                HttpContext.Response.End();
            }
            //查詢訂單成功
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());

                string trade_no = transaction_id;
                string order_no = notifyData.GetValue("out_trade_no").ToString();     //獲取訂單號
                string total_fee = (Convert.ToInt32(notifyData.GetValue("total_fee").ToString()) / 100.0).ToString();       //獲取總金額
                                                                                                                            //notifyData.GetValue("attach").ToString();
                HttpContext.Response.Write(res.ToXml());
                HttpContext.Response.End();

                PaymentBLL pbll = new PaymentBLL();
                bool b = pbll.PayCallback(order_no, total_fee, transaction_id);
            }
        }

4、查詢訂單,業務處理

        //查詢訂單
        private bool QueryOrder(string transaction_id)
        {
            WxPayData req = new WxPayData();
            req.SetValue("transaction_id", transaction_id);
            WxPayData res = WxPayApi.OrderQuery(req);
            if (res.GetValue("return_code").ToString() == "SUCCESS" &&
                res.GetValue("result_code").ToString() == "SUCCESS")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

到此這篇關於C# 微信支付回調驗簽處理的實現的文章就介紹到這瞭,更多相關C# 微信支付回調內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: