網(wǎng)站首頁 編程語言 正文
概述
在微信支付中,當(dāng)用戶支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,商戶需要接收處理,并返回應(yīng)答。接收微信支付異步通知回調(diào)地址也是有要求:通知url必須為直接可訪問的url,不能攜帶參數(shù)。
示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
在微信支付開發(fā),支付結(jié)果通用通知介紹說明頁面→https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3。
說明了:支付完成后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,商戶需要接收處理,并返回應(yīng)答。
c#方法
微信支付完成后會(huì)有一個(gè)支付回調(diào)頁面,處理支付完成后的事件,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
原文鏈接:https://mp.weixin.qq.com/s/5UNFnx4BWjcJxS7sDImeOQ
相關(guān)推薦
- 2022-09-07 python?正則表達(dá)式如何實(shí)現(xiàn)重疊匹配_python
- 2022-08-10 Qt利用DOM類實(shí)現(xiàn)讀取xml文件_C 語言
- 2022-04-14 Mac快速解決zsh: command not found: conda的方法
- 2022-04-04 微信登陸失敗Error: invalid code
- 2022-06-21 git基礎(chǔ)之各版本控制系統(tǒng)介紹_其它綜合
- 2022-12-09 ReactQuery?渲染優(yōu)化示例詳解_React
- 2022-09-09 python中g(shù)event庫的用法詳情_python
- 2022-11-10 一文詳解Redis中的持久化_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支