• H5实现聚合支付及踩坑 广东靓仔


    欢迎关注前端早茶,与广东靓仔携手共同进阶

    前端早茶专注前端,一起结伴同行,紧跟业界发展步伐~

    最近有个新的需求,H5实现聚合支付功能。页面在微信、支付宝以及云闪付App内实现扫码支付,大体步骤如下。

    根据userAgent区分浏览器,决定走哪个回调。

    核心点

    一、获取code

    1.云闪付

    let redirectUrl = 'https:******',//页面回调地址
    // 银联回调到这个地址,code会拼接在这个地址后面,字段名为userAuthCode,生产上回调地址必须是经过银联签约的认证网站,普通的网址会从云闪付的服务器跳出
    window.location.href = 'https://qr.95516.com/qrcGtwWeb-web/api/userAuth?version=1.0.0&redirectUrl=' + encodeURIComponent(redirectUrl )

    2.支付宝
    文档地址

    (1)登录支付宝平台申请应用

    (2)配置开发设置,添加获取会员信息功能
    详细说明文档地址

    //参数说明 app_id:应用的appId; scope:授权类型;redirect_uri:授权回调地址;state:自定义参数
    window.location.href = ‘https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL&state=STATE’


    3.微信
    登录微信公众平台服务号,配置授权域名
    参考微信开放文档

    window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect'


    二、根据code获取用户标识userId

    调用后台会封装好接口,上送上一步获取到的code换取userId

    三、支付

    1.云闪付下单支付

    //下单流程成功后后台会返回redirectUrl ,直接跳转支付即可
    window.location.href = redirectUrl


    2.支付宝支付参考文档

    <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script>
    <script>
    ap.tradePay({
    tradeNO: '201802282100100427058809844'
    }, function(res){
    ap.alert(res.resultCode);
    //支付完成的逻辑
    });
    </script>


    3.微信支付参考文档

    WeixinJSBridge.invoke(
    'getBrandWCPayRequest', {
    "appId":"wx2421b1c4370ec43b", //公众号ID,由商户传入
    "timeStamp":"1395712654", //时间戳,自1970年以来的秒数
    "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串
    "package":"prepay_id=u802345jgfjsdfgsdg888",
    "signType":"MD5", //微信签名方式:
    "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
    },
    function(res){
    if(res.err_msg == "get_brand_wcpay_request:ok" ){
    // 使用以上方式判断前端返回,微信团队郑重提示:
    //res.err_msg将在用户支付成功

    具体实现

    支付宝

    一、通过授权获取auth_code

    1、通过CDN方式引入支付宝jsapi

    <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.min.js"></script>


    2、通过getAuthCodeAPI根据主动授权或静默授权获得auth_code

    ap.getAuthCode({
    scopes: ['auth_user'],
    // 主动授权:auth_user,静默授权:auth_base。或者其它scope。如需同时获取用户多项授权,可在 scopes 中传入多个 scope 值。
    success: (res) => {
    res.authCode
    },
    });


    3、获得auth_code返回给后端换取 access_token、user_id

    二、生成tradeNO

    根据user_id,二维码id和金额返回给后端,后端会生成一个 tradeNO(支付宝交易号)
    注:支付宝H5开发文档给出两种调起收银台的支付方式,我这里用的是使用支付宝交易号进行调起,
    详细方法请前往(https://myjsapi.alipay.com/jsapi/native/trade-pay.html)

    三、根据tradeNO调起支付宝收银台

    ap.tradePay(
    {
    tradeNO: JSON.parse(data.expend.pay_info).tradeNO
    },
    (res) => {
    // ap.alert(res.resultCode);
    if (res.resultCode == 9000) {
    // 支付成功
    } else if (res.resultCode == 8000 || res.resultCode == 6001) {
    // 正在处理中 || 取消
    } else {
    // 支付失败
    }
    }
    );

    微信

    一、通过拼接地址重定向的方式授权获取code

    1.拼接地址参数:
    redirect_uri:重定向地址。(注:重定向地址需要使用 urlEncode 对链接进行处理)
    appId:公众号的唯一标识。
    scope:授权方式。(注:snsapi_base (静默授权),snsapi_userinfo (弹出授权页面))
    response_type:返回类型,请填写code。(写死即可)
    #wechat_redirect:无论直接打开还是做页面302重定向时候,必须带此参数。


    2.拼接列子:
    如果静默授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE

    let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`;
    
    window.location.replace(url);


    3.截取code值


    二、把code值传给后台,后台返回用户userId
    三、使用JSAPI 调起收银台

    WeixinJSBridge.invoke('getBrandWCPayRequest', {
    "appId": "wx2421b1c4370ec43b",
    "timeStamp": "1395712654",
    "nonceStr": "e61463f8efa94090b1f366cccfbbb444",
    "package": "prepay_id=up_wx21201855730335ac86f8c43d1889123400",
    "signType": "RSA",
    "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==" //微信签名
    },
    function(res) {
    if (res.err_msg == "get_brand_wcpay_request:ok") {
    // 使用以上方式判断前端返回,微信团队郑重提示:
    //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
    }
    });
    }

    在微信浏览器中可以直接调用WeixinJSBridge.invoke API

  • 相关阅读:
    【CLR in c#】事件
    IComparer 指定排序。
    【CLR in c#】属性
    C# Aspect-Oriented Programming(AOP) 利用多种模式实现动态代理
    设计模式六大原则(六): 开闭原则(Open Closed Principle)
    设计模式六大原则(五):迪米特法则(Law Of Demeter)
    设计模式六大原则(四):接口隔离原则(Interface Segregation Principle)
    设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)
    设计模式六大原则(二):里氏替换原则(Liskov Substitution Principle)
    设计模式六大原则(一):单一职责原则(Single Responsibility Principle)
  • 原文地址:https://www.cnblogs.com/cczlovexw/p/16081584.html
Copyright © 2020-2023  润新知