C# 微信支付回調(diào)驗(yàn)簽處理
概述
在微信支付中,當(dāng)用戶支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,商戶需要接收處理,并返回應(yīng)答。接收微信支付異步通知回調(diào)地址也是有要求:通知url必須為直接可訪問(wèn)的url,不能攜帶參數(shù)。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
在微信支付開(kāi)發(fā),支付結(jié)果通用通知介紹說(shuō)明頁(yè)面→https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3。
說(shuō)明了:支付完成后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,商戶需要接收處理,并返回應(yīng)答。
c#方法
微信支付完成后會(huì)有一個(gè)支付回調(diào)頁(yè)面,處理支付完成后的事件,V3支付回調(diào)的數(shù)據(jù)形式為XML格式。
1、定義一個(gè)model類,處理一般構(gòu)造函數(shù),用于解析XML對(duì)象;
- #region WeiXin APP
- // Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");
- WxPayData data = new WxPayData();
- //data.SetValue("attach", model.Dowhere);//附加數(shù)據(jù)
- data.SetValue("body", model.Title);//商品描述
- data.SetValue("out_trade_no", model.LocalTransationNo);// WxPayApi.GenerateOutTradeNo());//隨機(jī)字符串
- data.SetValue("total_fee", Convert.ToInt32(model.Amount * 100));//總金額
- data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時(shí)間
- data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易結(jié)束時(shí)間 //data.SetValue("goods_tag", "goods_tag");//商品標(biāo)記
- data.SetValue("trade_type", "APP");//交易類型
- //data.SetValue("product_id", model.ProductId);//商品ID
- WxPayData r = WxPayApi.UnifiedOrder(data);//調(diào)用統(tǒng)一下單接口
- string prepay_id = r.GetValue("prepay_id").ToString();
- WxPayData da2 = new WxPayData();
- da2.SetValue("appid", WxPayConfig.APPID);//公眾賬號(hào)ID
- da2.SetValue("noncestr", WxPayApi.GenerateNonceStr());//商戶號(hào)
- da2.SetValue("package", "Sign=WXPay");//商品描述
- da2.SetValue("partnerid", WxPayConfig.MCHID);// WxPayApi.GenerateOutTradeNo());//隨機(jī)字符串
- da2.SetValue("prepayid", prepay_id);//總金額
- da2.SetValue("timestamp", WxPayApi.GenerateTimeStamp());//交易起始時(shí)間
- #endregion
2、檢查支付結(jié)果中transaction_id是否存在
- //https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
- WxPayData notifyData = (new Com.WeiXin.Notify(this.HttpContext)).GetNotifyData();
- //檢查支付結(jié)果中transaction_id是否存在
- if (!notifyData.IsSet("transaction_id"))
- {
- //若transaction_id不存在,則立即返回結(jié)果給微信支付后臺(tái)
- WxPayData res = new WxPayData();
- res.SetValue("return_code", "FAIL");
- res.SetValue("return_msg", "支付結(jié)果中微信訂單號(hào)不存在");
- 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、查詢訂單,判斷訂單真實(shí)性
- //查詢訂單,判斷訂單真實(shí)性
- if (!QueryOrder(transaction_id))
- {
- //若訂單查詢失敗,則立即返回結(jié)果給微信支付后臺(tái)
- 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(); //獲取訂單號(hào)
- 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、查詢訂單,業(yè)務(wù)處理
- //查詢訂單
- 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
- UP技術(shù)控
- 江東子弟多才俊,卷土重來(lái)未可知。——唐·杜牧
- 447篇原創(chuàng)內(nèi)容
- 公眾號(hào)