博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信JSApi支付~订单号和微信交易号
阅读量:6247 次
发布时间:2019-06-22

本文共 3951 字,大约阅读时间需要 13 分钟。

谈谈transactionId和out_trade_no

前一篇文章反映不错,所以又写了个后篇,呵呵。

每个第三方在线支付系统中都会有至少两类订单号,其一为支付系统的订单号,我们称为transactionId,其二为商户平台的订单号,我们通常称为out_trade_no,这两个号一般用来对账,在第三方支付平台你可以通过这两个订单号来查询订单的状态,而在商户自己的网站后台,也可以查询它的状态,一般地,transactionId由支付系统生成,并在回调时转回给商户;而out_trade_no一般在商户平台生成,自己可以设计自己的规则,然后把这个ID转到第三方支付平台,在支付成功后,第三方同样把这个号转回来,我们通过这个号进行商户系统的其它操作。

看一下第三方支付的流程图

对第三方支付的封装

封装要求通用,对任何一个项目都可以灵活的使用它,这是最重要的,要想实现松耦合,需要记住委托的概念,我们在订单回调时,定义一个订单所要数据的实体,然后以这个实体做为参数,定义一个委托,当然你完全可以使用.net为我们提供的Action,Func等通用的委托对象,这在大叔框架里通常被看到,也是大叔的常客!

下面是微信支付的封装,可以看到业务代码只写自己业务,而不处理任务微信API相关的东西

///         /// 返回链接串        ///         /// 
public string Get() { int money = 10; string orderID = "Lind0001"; Logger.LoggerFactory.Instance.Logger_Info("发送订单号" + orderID); return JsApiImplement.Send(money, orderID); } //微信回调 public void Notify() { JsApiImplement.Notify((model) => { Logger.LoggerFactory.Instance.Logger_Info("回调订单号" + model.Out_Trade_No); //更新领域订单状态,用户账户数据,流水等 }); }

微信回调实体是大叔自己定义的,应该可以满足大部分业务的需要了,主要用于回调业务层的方法

///     /// 微信回调数据模型    ///     public class NotifyModel    {        ///         /// 当次交易存储到微信平台的订单号        ///         public string Transaction_Id { get; set; }        ///         /// 系统本身生成的订单号        ///         public string Out_Trade_No { get; set; }        ///         /// 对应当前公众号的用户OpenId        ///         public string OpenId { get; set; }        ///         /// 微信用户唯一标识        ///         public string UniqueId { get; set; }    }

而对于方法回调JsApiImplement.Notify方法,我们在底层进行了封装,对外公开一个委托,这个委托实现了方法的回调,当执行到微信核心业务时,回调业务层的方法即可。

///         /// JsApi微信回调        ///         public static void Notify(Action
action) { var context = System.Web.HttpContext.Current; ResultNotify resultNotify = new ResultNotify(context); resultNotify.ProcessNotify(action); }

其实,我在看微信API时,也发现了不少问题,感觉他们的.net开发人员功力不够,或者说代码不是很严谨,但一些公用基类,应该声明为abstract,一般必须要子类实现的方法,应该声明为abstract,但它们都没有这样做,感觉很奇怪,哈哈,下面是我对微信Notify

类的修改,加了一些应该加的,去了一些应该去的,感觉舒服多了!

///     /// 回调处理基类    /// 主要负责接收微信支付后台发送过来的数据,对数据进行签名验证    /// 子类在此类基础上进行派生并重写自己的回调处理过程    ///     public abstract class Notify    {        public HttpContext page { get; set; }        public Notify(HttpContext page)        {            this.page = page;        }        ///         /// 接收从微信支付后台发送过来的数据并验证签名        ///         /// 
微信支付后台返回的数据
public WxPayData GetNotifyData() { //接收从微信后台POST过来的数据 System.IO.Stream s = page.Request.InputStream; int count = 0; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString()); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } Log.Info(this.GetType().ToString(), "Check sign success"); return data; } //派生类自已必须重写这个方法 public abstract void ProcessNotify(Action
action); }

对于第三方支付就说到这样,希望大家自己也对一些东西进行封装,方便其它项目中直接使用它们!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Aix下查看内存命令
查看>>
[Android]JsonObject解析
查看>>
最好用的软件快速开发平台-全部源码-3800/套
查看>>
移动端fixed后 横竖屏切换时上部或下部出现空隙问题
查看>>
Django ORM 操作 必知必会13条 单表查询
查看>>
selenium 安装与 chromedriver安装
查看>>
ethereumjs/ethereumjs-vm-1-简介
查看>>
go标准库的学习-fmt
查看>>
iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
查看>>
Java集合框架中的快速失败(fail—fast)机制
查看>>
特殊的上下文选择符
查看>>
iphone-common-codes-ccteam源代码 CCUIApplication.m
查看>>
展开和折叠GridView行
查看>>
SharePoint PeopleEditor 控件的使用
查看>>
删除mysql__转
查看>>
python+selenium的使用
查看>>
python2.7中MySQLdb的安装与使用详解
查看>>
知乎技术方案初探[转]
查看>>
Java中的Thread与Runnable的区别
查看>>
2018/11/29 一个64位操作系统的设计与实现 02 (安装nasm)
查看>>