0 说明

正文里说的微信公众号支付对接指的凡对接第三正值出平台的微信公众号支付接口。
非微信支付法定文档里的公众号支付开发者文档那样的属。不过,毕竟腾讯会拿一部分水道推广为银行或者发付出牌照的支出机构,所以,第三在的民众号支付为是在腾讯微信公众号开的底子及开的改建。所以,基本的请参数、签名机制、响应参数、交互流程、数据格式都一致的。

 

 

图片 1

1 引言

…..

2 方案概述

2.1 行业背景
微信支付,是冲微信客户端提供的支出服务功能。同时向商提供销售经理分析、账户以及资产管理的机能支撑。用户通过扫描二维码、反扫二维码等又艺术调起微信支付模块形成支付。
【二维码支付正扫和反扫的分别在何】
恰恰扫:即收款码支付,也就算是生意人提供收费二维码,而顾客因此手机APP扫码支付
反扫:即付款码支付,也即是顾客提供付款二维码,而商使用扫描枪扫码收款
2.1.1群众号出
大众号开是用户以微信中打开商户的H5页面商户以H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块形成开发。应用场景有:

用户以微信公众账号内进入局公众号,打开某个主页面,完成开


用户之挚友于爱人围、聊天窗口等享受商家页面总是,用户点击链接打开店页面,完成开


将商贩页面转换成二维码,用户扫描二维码后当微信浏览器中开辟页面后就开发

【两栽实现方式】:原生态js支付与包裹形式

 

2.2 业务实现流程
2.2.1 公众账号支付工作

图片 2 

微信内网页支付时序图

打图可知,商户系统关系到之彼此操作:

  1. 别图文信息链接或者二维码
  2. 生成商户订单
  3. 调用统一下单API————————
  4. 生成JSAPI页面调用的支付参数并署名
    10.异步通商户结果———————–
    13.询问后台支付结果
    14.调于是查询API,查询支付结果————–

3 数据格式

xml

4 数字签名

4.2签名算法

MD5签名

MD5凡是同一种植选择要转变算法,通过以署名原始串后长经纪人通信秘钥,进行MD5运算,形成的摘要字符串即为签字结果。

4.2.1坏成自由数算法

微信支付API接口协议中含有字段nonce_str,关键承保签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将抱的值转换为字符串。

5 补单机制

照会重试机制

6 民众账号支付接口

6.1 初始化请求接口
6.1.1 业务功能
初始化JSAPI 请求,通过生成token_id
来进展互验证。

几个特殊的请求字段
字段名 变量名 必填 类型 说明
是否原生态 is_raw string(1) 是否原生态
用户openid sub_openid string(128)

微信用户关注商家公众号的openid(注:

使用测试商户号不需要传用户openid;

切换正式的商户号需获取openid,并把获取的openid 值传给sub_openid。在切换成正式商户号传sub_openid 参数前,需提供正式商户号和公众号(服务号)appid 由渠道方配置,如果没有配置的话,会报sub_appid and su_openid not match 错误,导致无法正常调用接口)———后文介绍如何获取openid

前台地址 callback_url string(255) 交易完成后跳转的URL,需给绝对路径,255 字符内格式 如:http://wap.tenpay.com/callback.asp 注:该地址只作为前端页面的一个跳转,需使用notify_url 通知结果作为支付最终结果。———扫码支付无此参数,即不需要商户上送交易完成的h5页面的。公众号支付这个参数可选,商户上送此页面也可做一些营销活动
是否限制信用卡

limit_credit_pay

String(32)

限定用户使用微信支付时能否使用信用卡,值为1,禁用信用卡;值为0 或者不传此参数则不禁用———默认是支持信用卡的,所以此字段可不上送, 微信个人转账是不支持信用卡消费的,这正是与公众号支付和扫码支付最大的区别

6.1.2 交互模式
请:后台请求交互模式
返回结果+通知:后台请求交互模式+后台通知交互模式
留意:一般失败的结果莫签。

是否原生态is_raw 否String(1)
值为1:是(对应文档6.2 一节);
值为0:否(对应文档6.3
一节约);不传默认是0

6.2 原生态js
支付接口———————–原生态js支付实例:可以关注“1声泪俱下外卖”这个群众号或直接在大哥大微信里钱管吃之无绳电话机充值查看

6.3 公众账号JS
支付接口————这是所谓的“封装形式”(H5网页支付模式)
6.3.1 业务功能
初始化JSAPI 请求,通过生成token_id
来进展交互验证。
如果调用时是为此的原生态js
支付,此接口可以忽略

6.4 JS 支付通知接口
及《威富通扫码支付接口文档V1.4.2.pdf》6.2
扫码通知接口

 

——————【重要】首先定看.txt—————————————————————————————————————————— 

1.支付时可以事先利用测试商户号和密钥(demo中为还发出描绘)
测试
商户号:’7551000001′
密钥:’9d101c97133837e13dde2d32a5054abb’
2.测试商户号有付出金额1头版之限量,正式商户号不见面生出
3.文档中请求接口时传的参数,必填啊凡的参数是必要传的(如发生缺乏会报错),必填啊乎的参数可以招为得不污染
4.回来参数中一定填呢凡的参数是必会回的,必填呢也的参数则不自然返回,必须盖实际收到及的参数为按

5.注意看文档里提供了零星种植实现方式,PHP和C#本demo中实现的凡我们封装的款型,调用支付请求接口获取到token_id,然后组装成https://pay.swiftpass.cn/pay/jspay?token\_id=9a0610bc519e782e6275e8c7dd94a445&showwxtitle=1这样的链接在服务号中调起支付(用户点击页面中的微信支付按钮时实际上就是点击的这个链接),JAVA版本则原生态js支付和封装形式都有实现,原生态支付时是调用支付请求接口获取到pay\_info,取其中的参数去调用微信jsapi(这种方式最后调起微信时跟官方原生接口一致)
装进形式就需要点击链接,简单些,实例:可以关注“广州市立”这个群众号具体看看
原生态js支付实例:可以关注“1声泪俱下外卖”这个群众号还是直接当手机微信里钱管被之无绳电话机充值查看

6.demo中之所以测试商户号不待传用户openid,即sub_openid参数置空
可是切换正式的商贾号时调用接口请求参数必须给sub_openid参数传入openid,同时伸手提供专业商户号和民众号(服务号)appid由我方配置,如果没配置来说,会报sub_appid
and su_openid not match错误,导致力不从心正常调用接口
取得openid
指导文档地址:http://www.cnblogs.com/txw1958/p/weixin76-user-info.html
获得民众号appid指导文档地址:http://jingyan.baidu.com/article/6525d4b12af618ac7c2e9468.html

 

——————公众号出两栽实现模式之验证——————————————————————————————————————— 

群众号出流程是先期调用接口文档6.1一如既往节约初始化请求接口获取到相应的回到值token_id和pay_info(对应的价值是json
格式字符串,仅当is_raw=1时才回),返回参数按 XML
的格式示例如下图:

图片 3

下一场下一个手续分为了简单单例外的模式:6.2平等节约原生态js支付与6.3平省公众账号JS支付

6.2原生态js支付

调用微信jspai方法,此方只有会以微信内置浏览器调用,在其他浏览器中没用,示例如下(注:示例代码中appId这六个参数有大大小小写,对应的价值就是初始化请求接口中归参数pay_info的值):

function jsApiCall()
{    
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest',{
            "appId" : "wx1f87d44db95cba7a", //公众号名称,由商户传入
            "timeStamp": "1468591622013", //时间戳,自1970 年以来的秒数
            "nonceStr" : "1468591622013", //随机串
            "package" : "prepay_id=wx201607152207013ae4e376760784153308",
            "signType" : "MD5", //微信签名方式:
            "paySign" : "AD5A9E19D38002461812E09C0910A815"  //微信签名,
        },function(res){
            if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                // 此处可以使用此方式判断前端返回,微信团队郑重提示:res.err_msg 将在用户支付成功后返回ok,但并不保证它绝对可靠,。
                document.location.href="pay_success.jsp";
            }
            /* for(var i in res){
                alert(res[i]);
            } */
        }
    );
}

 最后在网页代码里调用这个js方法就可调动起微信支付按:

<button type=”button”
onclick=”jsApiCall()” >微信支付</button>

只是想健康弹有开发密码框,商户方开发人员必须提供好之出授权目录由于服务商配置好,支付授权目录就为jspai方法代码所在页面的文本路径,如http://xxxx.com/zhifu/jsapi.html,授权目录就是http://xxxx.com/zhifu/(如果没有配置授权目录的话,支付时会无法弹出密码框或者提示当前页面URL未注册)

 

6.3群众账号JS支付

这种模式是由于我们进行了包装,用6.1如出一辙省初始化请求接口获取到之token_id值组装成https://pay.swiftpass.cn/pay/jspay?token\_id=1315838a57d0c83df0b62816220da070&showwxtitle=1这样的链接在手机微信中调起支付(用户点击页面中的微信支付按钮时实际上就是点击的这个链接,可以将链接放在手机微信文件传输助手去点击测试,注意token\_id的值要更换有效的),这种模式不用实现jsapi方法,也不要提供支付授权目录。

比6.2同一节约原生态js支付,直接点击链接的此形式以付出弹出确认支付的弹奏出框时会见多一个点绿色下面白色背景页面,实际上这背景页面是咱封装好的支付授权目录页面(对应一定的授权目录https://pay.swiftpass.cn/pay/),这也是不用商户提供支付授权目录的原因所在。

效果使图:图片 4

 

总的来说,封装的链接形式支付时简短些,且无需商户提供自己的授权目录(由咱们一定配置https://pay.swiftpass.cn/pay/),但体验可能没有原生态js支付好。

 

参考:

微信支付开发文档
https://pay.weixin.qq.com/wiki/doc/api/index.html

微信支付公众号开开发文档
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7\_1

微信公众号出H5调用详解(附代码)http://blog.csdn.net/qq\_28590639/article/details/49099275

 

——————获取微信用户的openid——————————————————————————————————————— 

至于用户openid:在关注者与民众号来信息交互后,公众号只是得关注者的OpenID(加密后底微信号,每个用户指向每个公众号的OpenID是绝无仅有的。对于不同公众号,同一用户之openid不同)。

取得openid属于微信公众平台开发之圈,可参考以下地方:http://www.cnblogs.com/txw1958/p/weixin76-user-info.html
第三节《**通过OAuth2.0方式不弹来授权页面获取用户基本信息**

step1:配备回调域名

登陆微信公众平台,菜单“设置”→“公众号设置”→功能设置→网页授权域名

图片 5

【定义】授权回调页面域名:用户以网页授权页同意授权为群众号晚,微信会将授权数据传给一个回调页面,回调页面需于此域名下,以担保安全可靠。

上述定义似乎会把人口带走误区,我平开始为整懵了。配了个回调地址,其实不用,只需要配备授权访问的域名就ok了,这里自己安排的是testpcenter.shenbianhui.cn。注意,要保证域名可访问并且只要将MP_verify_****.txt放到站点相应的目下,否则点击“确认”按钮会提示的。

step2:组织微信用户访问的url:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb8239ab824d12860&redirect_uri=http://testpcenter.shenbianhui.cn/QRCodeDemo/WeixinJSPay.aspx&response_type=code&scope=snsapi_base&state=1#wechat_redirect

 

其中,页面URL中的 scope=snsapi_base
代表以授权作用域为免弹有授权页面,直接跳转。

这时,我们在redirect_uri指向的页面“http://testpcenter.shenbianhui.cn/QRCodeDemo/WeixinJSPay.aspx”程序里,就可获取get方式的点滴独参数值code和state。

step3:根据code获取openid:

请求url:https://api.weixin.qq.com/sns/oauth2/access\_token?appid=wxb8639ab824d12861&secret=0e8d1234fd5345da5ea8e5fab61abcd7&code=02a9bed29b2185a9f0ed3a48fe56e700&grant\_type=authorization\_code

返回值:{“access_token”:”k2iC-Bfce_1ukB1UffUnAB8AnFvGp_8_lvKiMTKF_hILcjjbKpFRrtmWJ5KeWvPOxEu6wsqvT4-oQzYyXVMM__sfTCBJycWupAOLdEXOtrM”,”expires_in”:7200,”refresh_token”:”g39EWv6L4Fl7PVo859QPMw_VIMCVMCTco30Lk_-t35QP_mVhQjzvGlXk7MYk8nwkUsc-PxpT2a_kxcel5EAcwv41YizmdH7Hi7o57BIkKj4″,”openid”:”o48_Ct5YigM7JDZ6x3Havr4kgzQQ”,”scope”:”snsapi_base”}

专注,二貌似情形下,当code非法时,返回的凡{“errcode”:40029,”errmsg”:”invalid
code, hints: [ req_id: 1.Dnsa0402th10 ]”}

程序代码如下:

public partial class WeixinJSPay : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        tbOpenId.Text = GetOpenIdByCode();
    }

    /// <summary>
    /// 微信用户访问时,获取其openid
    /// </summary>
    private string GetOpenIdByCode()
    {
        /*
         * 给微信用户的请求地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb8239ab824d12860&redirect_uri=http://testpcenter.shenbianhui.cn/QRCodeDemo/WeixinJSPay.aspx&response_type=code&scope=snsapi_base&state=1#wechat_redirect
         */

        LogHelper.Write("--------:" + Request.Url);//示例:http://testpcenter.shenbianhui.cn/QRCodeDemo/WeixinJSPay.aspx?code=001bxIJx1Pi1ge0bZpLx1AAAJx1bxIJb&state=1

        string code = Request["code"];
        if (string.IsNullOrEmpty(code)) return "未获取到code参数";

        string url = string.Format(
            "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code",
           "wxb8239ab824d12860",
           "0e8d4313fd5345da5ea8e5fab61ddae7",
           code);

        LogHelper.Write("--------请求openid:" + url);
        string resultJson = CommonModel.WebCommon.SendStreamStr("", url);
        LogHelper.Write("--------响应报文:" + resultJson);
        dynamic model = JsonConvert.DeserializeObject<dynamic>(resultJson);
        if (model.openid == null) return "未获取到openid";
        return model.openid;
    }

}

 

相关文章

网站地图xml地图