微信支付接入和API封装使用

By admin in 亚洲必赢app在哪下载 on 2019年1月12日

在微信的施用上,微信支付是一个相比较实惠的一部分,但也是比较复杂的技巧中央,在微商大行其道的年代,自己的店家没有扩充微信支付类似也说但是去,微信支付目的在于为大面积微信用户及商户提供更优质的支付劳动,微信的支出和平安系列由腾讯财付通提供支撑。本文首要介绍如何在微信公众号上实现微信支付的连片、微信支付API的包装,以及API的调用,实现我们一些广阔的政工调用。

1、开通微信支付并部署

微信支付是急需微信公众号的求证基础,也就是只对认证的Jeep号开放,微信认证需要签字相关的资料,并且举办对账认证,一般会有电话互换确认有关的信息的。

亚洲必赢app在哪下载 1

在微信支付API先河拔取前,我们一般需要在后台举行自然的安排,如我辈需要安排公众号支付的授权目录,测试白名单等音信,以及扫码补助的回调处理地方(这多少个实现在后头再讲),如下所示。

亚洲必赢app在哪下载 2

在应用API在此以前,大家要了然微信一些要害的操作,如退款、裁撤订单等操作是需要注解的,而且健康的开销操作,我们也急需经纪人号、商户支付秘钥等信息,这么些声明和秘钥音信,是大家从微信支付的商贩平台上拿到的,我们微信支付开通并审查通过后,我们就足以登录商户平台展开有关的操作了。

首先大家需要在付出的处理器上设置证书。

亚洲必赢app在哪下载 3

然后需要设置API的秘钥

亚洲必赢app在哪下载 4

终极在【API安全】项目上下载证书供大家付出环境使用。

亚洲必赢app在哪下载 5

 

2、微信支付API的介绍

微信支付配置相关的参数,并收获证书、API秘钥、商户号等音信后,我们得以起来领会微信支付的API的有血有肉接纳了,我们需要先把API封装为C#的类库举行应用,那样才能在各个应用里面方便调用。

微信支付分为有多种措施,如扫码支付、公众号支付、JSAPI支付、APP支付等地点,可是基本的API都差不多,基本上都掩盖了下边截图的多少个API,只是有一对的接口差别。

亚洲必赢app在哪下载 6

我们可以从里面扫码支付起首了然,那个是对二维码举办扫码支付的意况,分为了形式一和模式二三种模式。

亚洲必赢app在哪下载 7

扫码支付可分为两种情势,商户依照支付场景采用相应情势。

【模式一】:商户后台系统基于微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号)。用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统(需要设置支出回调URL),商户后台系统依据productid生成支付交易,最后微信支付序列倡导用户支付流程。

【形式二】:商户后台系统调用微信支付【统一下单API】生成预付交易,将接口再次回到的链接生成二维码,用户扫码后输入密码完成开发交易。注意:该形式的预付单有效期为2小时,过期后无法支付。

亚洲必赢app在哪下载,基于扫码支付的API表达,我们得以分级对这么些接口(如统一下单、查询订单、关闭订单、申请退款、查询退款、下载对账单等接口举办逐一封装,以有利于我们的付出使用。

形式一和模式二,都亟需使用到了合并下单的接口,然后生成对应的二维码给客户扫码支付使用。

这就是说我们先来探视统一下单的接口表明,以了解它的切实可行行使。

1)应用场景

除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,重返正确的预支付交易回话标识后再按扫码、JSAPI、APP等不等情状生成交易串调起支付。

2)接口链接

URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

3)是否需要阐明

不需要

4)请求参数

呼吁参数近似很多,大概分为两部分,一部分是系统必须的固化参数,一部分是业务所需的参数。

系统必须的定位参数如下所示。

亚洲必赢app在哪下载 8

有些是工作参数,业务参数如下所示,紧倘使记录订单的有关制品ID、表明、费用等等

亚洲必赢app在哪下载 9

微信支付接口的调用和民众号其它接口调用不太相同,这里所有是拔取XML举办置换的,感觉并未JSON那么方便灵活,如下所示是统一下单的接口提交数据。

亚洲必赢app在哪下载 10 

接下来回来的数目也是XML的,如上边例子代码所示,而且其中的字段内容还不太确定,因而按官网的提出,使用字典集合来存储重返的多寡对象。

亚洲必赢app在哪下载 11

 

3、微信支付APIC#包装和调用

据悉地点的描述,我们大概领会了微信支付API
的光景表达,依照这多少个新闻,咱们得以对它举行C#代码的包装了,对于代码的包装,我们关键点在里头第一个,如若顺利封装好第一个接口,那么后边的依据通用的不二法门,就很容易继续处理那么些接口了。

比如,大家得以定义好微信支付的API接口定义,如下所示。

    /// <summary>
    /// 微信支付接口
    /// </summary>
    public interface ITenPayApi
    {      
        /// <summary>
        /// 生成扫描支付模式一URL
        /// </summary>
        /// <param name="productId">商品ID</param>
        /// <returns></returns>
        string GetPrePayUrl(string productId);

        /// <summary>
        /// 生成直接支付url,支付url有效期为2小时,模式二
        /// </summary>
        /// <param name="info">商品订单数据</param>
        /// <returns></returns>
        string GetPayUrl(WxPayOrderData info);

        /// <summary>
        /// 统一下单。(不需要证书,默认不需要)
        /// 除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,
        /// 返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
        /// </summary>
        /// <param name="info">商品订单数据</param>
        WxPayData UnifiedOrder(WxPayOrderData info);

        .............

里头的接口方法的输入参数我们定义一个实体类 WxPayOrderData 来储存一些作业参数,这么些参数依照第二点的接口表达举办定义,代码如下所示

    /// <summary>
    /// 统一下单的商品订单信息
    /// </summary>
    public class WxPayOrderData
    {
        /// <summary>
        /// 商品ID, trade_type=NATIVE,此参数必传
        /// </summary>
        public string product_id { get; set; }
        /// <summary>
        /// 商品或支付单简要描述
        /// </summary>
        public string body { get; set; }
        /// <summary>
        /// 订单总金额,单位为分
        /// </summary>
        public int total_fee { get; set; }
        /// <summary>
        /// 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
        /// </summary>
        public string goods_tag { get; set; }

        /// <summary>
        /// 交易类型,默认为:NATIVE。
        /// JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
        /// </summary>
        public string trade_type { get; set; }

        /// <summary>
        /// 商品名称明细列表
        /// </summary>
        public string detail { get; set; }
        /// <summary>
        /// 附加数据
        /// 在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
        /// </summary>
        public string attach { get; set; }
        /// <summary>
        /// 用户标识
        /// trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。
        /// </summary>
        public string openid { get; set; }

        public WxPayOrderData()
        {
            this.trade_type = "NATIVE";
        }
    }

下一场我们定义一个接口再次来到的类WxPayData,它用来存储再次来到的靶子音信的,这一个类在官网例子里面有证实,其中间内置一个排序过的字典对象举办仓储数据,部分代码如下所示,我对它举行了相关的修改,以方便在构造函数里面先导化一些必需的参数(固定参数)。

    public class WxPayData
    {
        //采用排序的Dictionary的好处是方便对数据包进行签名,不用再签名之前再做一次排序
        private SortedDictionary<string, object> m_values = new SortedDictionary<string, object>();

        /// <summary>
        /// 默认构造函数
        /// 如果initDefault为true,则自动填入字段(appid,mch_id,time_stamp,nonce_str,out_trade_no,)
        /// </summary>
        public WxPayData(bool initDefault = false)
        {
            if(initDefault)
            {
                Init();
            }
        }

        /// <summary>
        /// 对象初始化后,自动填入字段(appid,mch_id,time_stamp,nonce_str,out_trade_no,)
        /// </summary>
        public void Init()
        {
            //初始化几个参数
            this.SetValue("appid", WxPayConfig.APPID);//公众帐号id
            this.SetValue("mch_id", WxPayConfig.MCHID);//商户号
            this.SetValue("nonce_str", GenerateNonceStr());//随机字符串
            this.SetValue("out_trade_no", GenerateOutTradeNo(WxPayConfig.MCHID));//随机字符串

        }

接下来我们依据地点的数码定义,可以兑现合并下单的函数内容,首如果把输入参数转换为大家需要的字典参数集合,如下代码所示。

        /// <summary>
        /// 统一下单。(不需要证书,默认不需要)
        /// 除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,
        /// 返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
        /// </summary>
        /// <param name="info">商品订单数据</param>
        public WxPayData UnifiedOrder(WxPayOrderData info)
        {
            WxPayData data = new WxPayData(true);
            data.SetValue("product_id", info.product_id);//商品ID
            data.SetValue("openid", info.openid);//商品ID

            //其他信息
            data.SetValue("body", info.body);//商品描述
            data.SetValue("attach", info.attach);//附加数据
            data.SetValue("total_fee", info.total_fee);//总金额
            data.SetValue("goods_tag", info.goods_tag);//商品标记
            data.SetValue("trade_type", info.trade_type);//交易类型

            //默认构建
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间

          ..............

末尾的数据互换逻辑,我们由此对URL进行POST提交XML数据给它拿走重回结果就可以了,如下所示。

            string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            return GetPostResult(data, url);

里面地方的函数的代码逻辑如下所示,紧假如把重临的结果再还原为XML对象类WxPayData。

        /// <summary>
        /// 通用的获取结果函数
        /// </summary>
        private WxPayData GetPostResult(WxPayData data, string url)
        {
            string xml = data.ToXml();
            string response = helper.GetHtml(url, xml, true);

            WxPayData result = new WxPayData();
            result.FromXml(response);
            return result;
        }   

对此扫码操作的情势二,间接生成一种二维码,不需要后台举行回调的,那么它的贯彻逻辑只需要对下边代码举办打包就足以了,如先构建二维码的函数代码如下所示。

        /// <summary>
        /// 生成直接支付url,支付url有效期为2小时,模式二
        /// </summary>
        /// <param name="info">商品订单数据</param>
        /// <returns></returns>
        public string GetPayUrl(WxPayOrderData info)
        {
            WxPayData result = UnifiedOrder(info);//调用统一下单接口
            return result.GetString("code_url");//获得统一下单接口返回的二维码链接
        }

如在Winform界面里面,调用生成二维码的代码如下所示,首要逻辑就是构建好二维码,然后显示在界面上。

        private void btnGetPayUrl_Click(object sender, EventArgs e)
        {
            //测试扫码模式二的生成二维码方式
            WxPayOrderData data = new WxPayOrderData()
            {
                product_id = "123456789",
                body = "测试支付-模式二",
                attach = "爱奇迪技术支持",
                detail = "测试扫码支付-模式二",
                total_fee = 1,
                goods_tag = "test1"
            };

            var url = api.GetPayUrl(data);
            var image = api.GenerateQRImage(url);

            this.imgGetPayUrl.Image = image;
            this.imgGetPayUrl.SizeMode = PictureBoxSizeMode.StretchImage;
        }

亚洲必赢app在哪下载 12

另外对于情势一,它在前者传入一个简练的产品ID,生成二维码,当用户扫码的时候,微信后台会调用商户平台(我们服务器)的回调处理情势,这么些回调方法会调用统一下单的API举行变更支付交易,过程有点复杂,大家来看望,大家的贯彻代码如下所示。

        /// <summary>
        /// 生成扫描支付模式一URL
        /// </summary>
        /// <param name="productId">商品ID</param>
        /// <returns></returns>
        public string GetPrePayUrl(string productId)
        {
            WxPayData data = new WxPayData(true);
            data.SetValue("product_id", productId);//商品ID     
            data.SetValue("time_stamp", data.GenerateTimeStamp());//随机字符串         
            data.SetValue("sign", data.MakeSign());//签名

            string str = data.ToUrlParams();//转换为URL串
            string url = "weixin://wxpay/bizpayurl?" + str;

            return url;
        }

它的调用代码生成二维码操作如下所示。

        private void btnGetPrePayUrl_Click(object sender, EventArgs e)
        {
            var productId = "12345678";
            var url = api.GetPrePayUrl(productId);
            var image = api.GenerateQRImage(url);

            this.imgGetPrePayUrl.Image = image;
            this.imgGetPayUrl.SizeMode = PictureBoxSizeMode.StretchImage;
        }

我们在率先小节里面介绍了,需要在微信后台配置扫码的回调函数,如下所示。

亚洲必赢app在哪下载 13

如此这般大家还索要加上一个页面aspx、或者一般处理程序ashx的方法来贯彻扫码的回调过程。具体的逻辑也就是在这么些页面里面得到到提交过来的参数,然后调用统一下单处理后,举行多少重临即可,代码逻辑如下所示。

亚洲必赢app在哪下载 14

 

4、在页面上举行扫码处理

前方的例子,我介绍了Winfrom的扫码例子,很多时候,大家的使用可能是遵照Web的,那么它的兑现是什么的吧,下边我连续介绍一下。

首先我们在大团结的事体Web后台系统内部,添加三个页面,紧假使用来生成二维码在页面上举行映现的,如下所示。

亚洲必赢app在哪下载 15

末尾大家在NativePayPage.aspx页面上出示我们的二维码,方便用户进行扫码支付处理,页面的代码很简短,大家只需要在前端页面放置多个图片控件,图片内容通过MakeQRCode.aspx页面举办生成就可以了。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="content-type" content="text/html;image/gif;charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1" /> 
    <title>微信支付样例-扫码支付</title>
</head>
<body>
    <div style="margin-left: 10px;color:#00CD00;font-size:30px;font-weight: bolder;">扫码支付模式一</div><br/>
    <asp:Image ID="Image1" runat="server" style="width:200px;height:200px;"/>
    <br/><br/><br/>
    <div style="margin-left: 10px;color:#00CD00;font-size:30px;font-weight: bolder;">扫码支付模式二</div><br/>
    <asp:Image ID="Image2" runat="server" style="width:200px;height:200px;"/>

</body>
</html>

页面后台的代码就是绑定二维码的历程,代码如下所示,和Winform的代码类似操作。

        protected void Page_Load(object sender, EventArgs e)
        {
            TenPayApi api = new TenPayApi();

            var productId = "123456789";
            //生成扫码支付模式一url
            string url1 = api.GetPrePayUrl(productId);

            //生成扫码支付模式二url
            WxPayOrderData info = new WxPayOrderData()
            {
                product_id = "123456789",
                body = "测试支付-模式二",
                attach = "爱奇迪技术支持",
                detail = "测试扫码支付-模式二",
                total_fee = 1,
                goods_tag = "test1"
            };
            string url2 = api.GetPayUrl(info);

            //将url生成二维码图片
            Image1.ImageUrl = "MakeQRCode.aspx?data=" + HttpUtility.UrlEncode(url1);
            Image2.ImageUrl = "MakeQRCode.aspx?data=" + HttpUtility.UrlEncode(url2);
        }

兑现后的页面效果如下所示。

亚洲必赢app在哪下载 16

兑现并预览效果,确定是大家所需的页面后,我们可以发布在万众号的菜谱连接上举办测试使用了。

亚洲必赢app在哪下载 17

打开微信公众号-台北爱奇迪,我们可以看出相应的菜谱发生变更,并且探望进入微信支付的菜系可以拓展付出了。

亚洲必赢app在哪下载 18  亚洲必赢app在哪下载 19  亚洲必赢app在哪下载 20

 

以上就是微信支付的扫码过程的一个兑现,微信支付还包括广大别样API接口,前边有空子可以连续举行介绍。微信支付的接口实现虽然相对其他微信接口相比复杂一些,不过大家只要形成多少个案例,前边的就相对相比较容易的了,因为它的调用形式大多相比较一致,很接近。

 

即使对这么些《C#付出微信门户及应用》连串感兴趣,可以关注本身的任何著作,系列小说如下所示:

C#开发微信门户及应用(36)–微信卡劵管理的包装操作

C#付出微信门户及采纳(35)–微信支付之公司付款封装操作

C#支出微信门户及运用(34)–微信裂变红包

C#支付微信门户及使用(33)–微信现金红包的包装及应用

C#开发微信门户及采取(32)–微信支付接入和API封装使用

C#支出微信门户及采纳(31)–微信语义领会接口的贯彻和拍卖

C#支出微信门户及运用(30)–音讯的群发处理和预览功用

C#付出微信门户及运用(28)–微信“摇一摇·周边”效率的使用和接口的实现

C#付出微信门户及利用(27)-公众号模板音讯管理 

C#支付微信门户及使用(26)-公众号微信资料管理

C#开发微信门户及利用(25)-微信公司号的客户端管住效率

C#支出微信门户及使用(24)-微信小店货架信息保管

C#支付微信门户及利用(23)-微信小店商品管理接口的包裹和测试

C#付出微信门户及使用(22)-微信小店的开销和采用

C#支出微信门户及利用(21)-微信公司号的信息和事件的收到处理及解密 

C#支付微信门户及使用(20)-微信集团号的菜谱管理

C#开发微信门户及运用(19)-微信公司号的音讯发送(文本、图片、文件、语音、视频、图文消息等)

C#开发微信门户及利用(18)-微信公司号的通讯录管理支付之成员管理

C#付出微信门户及使用(17)-微信集团号的通讯录管理支出之部门管理

C#支出微信门户及运用(16)-微信集团号的部署和利用

C#支付微信门户及应用(15)-微信菜单扩展扫一扫、发图片、发地理地点成效

C#开发微信门户及拔取(14)-在微信菜单中使用重定向获取用户数量

C#付出微信门户及利用(13)-使用地理地方扩张相关应用

C#支出微信门户及使用(12)-使用语音处理

C#开发微信门户及利用(11)–微信菜单的有余显示方法介绍

C#付出微信门户及使用(10)–在治本体系中协同微信用户分组消息

C#支出微信门户及接纳(9)-微信门户菜单管理及提交到微信服务器

C#支付微信门户及利用(8)-微信门户应用管理系列机能介绍

C#开发微信门户及采用(7)-微信多客服效用及支付集成

C#支出微信门户及利用(6)–微信门户菜单的管制操作

C#支付微信门户及采用(5)–用户分组音讯保管

C#付出微信门户及利用(4)–关注用户列表及详细音讯管理

C#支出微信门户及拔取(3)–文本消息和图文消息的回答

C#开发微信门户及利用(2)–微信音讯的拍卖和应对

C#付出微信门户及采用(1)–起初接纳微信接口

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 亚洲必赢app官方下载 版权所有