js 支付功能

提示:做项目以来,做过h5页面支付,做过微信公众号页面支付,总的来说,就是微信支付和支付宝支付。本章是对支付功能一些总结,反正调支付功能看起来简单,坑也不少,所以简单记录一下,希望下次写到能更顺利


前言

本章主要两大块,api总结和项目总结,之前项目已经结束有一段时间了,现在总结的可能会有疏忽遗漏,所以仅供参考,下次再遇到会查缺补漏


API总结

1.微信支付

1.1 JSAPI支付

1.1.1 业务流程:
- 下单
- 获取支付单参数prepay_id,paySign等
- 发起支付,请求JSAPI接口
- 输入密码,同时提交支付授权
- 获得支付结果
- 跳转页面
1.1.2 微信内H5调起支付
  • 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
  • 注意:WeixinJSBridge内置对象在其他浏览器中无效。
  • JS API的返回结果:
    • get_brand_wcpay_request:ok 用户成功完成支付
    • get_brand_wcpay_request:cancel 用户遇到错误
    • get_brand_wcpay_request:fail 用户主动放弃

代码如下(示例):

function onBridgeReady(){
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest', {
            "appId":"wx2421b1c4370ec43b",     //公众号名称,由商户传入     
            "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将在用户支付成功后返回ok,但并不保证它绝对可靠。
            } 
        }
    ); 
}
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();
}

1.2 小程序支付

代码如下(示例):

wx.requestPayment({
    'timeStamp': '',
    'nonceStr': '',
    'package': '',
    'signType': 'MD5',
    'paySign': '',
    'success':function(res){},
    'fail':function(res){},
    'complete':function(res){}
})

1.3 H5支付

  • 主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付
  • 后端会返回一个支付的路径,跳到微信支付进行操作就可以了
  • 正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。

代码如下(示例):

// 拼接后的地址为MWEB_URL为:
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn

代码如下(示例):

this.payUrl = res.data.data.codeUrl 
window.location.href = this.payUrl + '&redirect_url='回调地址'

1.4 PC或native

1.4.1 二维码支付
  • 扫码支付
  • 后端返回一个支付二维码的图片,前端做展示就好了

2.支付宝支付

待补充


项目总结

JSAPI支付(vue+微信公众号)

  • 坑一: WeixinJSBridge.invoke() 里的参数得是json格式,双引号不要省,不知道是不是重点,反正做就对了
  • 坑二: data的数据是下单之后,后台调微信统一下单接口返回的数据,要注意,最好让后端完全组装好数据,再返回,前端直接拿来用,这样不是为了偷懒,是经验之谈,因为后端得到微信返回的数据要经过加签和二次加签,整理一下才能给前端用,既然都要处理,不如一次到位,完全封装好再返回,前端直接拿来用,出bug的可能会更小一点

代码如下(示例):

// 在下单方法里调用
this_.callpay(res.data.datas);
// 支付代码
wxPay(data) {
  var that = this;
    WeixinJSBridge.invoke(
      "getBrandWCPayRequest",
      {
        "appId": data.appId,     //公众号名称,由商户传入     
        "timeStamp":data.timeStamp, //时间戳,自1970年以来的秒数     
        "nonceStr":data.nonceStr, //随机串     
        "package":data.package,     
        "signType":"MD5",         //微信签名方式:     
        "paySign":data.paySign //微信签名 
      },
      function(res) {
        if (res.err_msg == "get_brand_wcpay_request:ok") {
           console.log('支付成功');
        } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
          console.log('支付取消');
        } else {
          console.log('支付失败');
        }
      }
   );
},
callpay(data) {
    if (typeof WeixinJSBridge == "undefined") {
      if (document.addEventListener) {
        document.addEventListener("WeixinJSBridgeReady", this.wxPay, false);
      } else if (document.attachEvent) {
        document.attachEvent("WeixinJSBridgeReady", this.wxPay);
        document.attachEvent("onWeixinJSBridgeReady", this.wxPay);
      }
    } else {
      this.wxPay(data);
    }
}

JSAPI 支付踩坑

问题描述:

调起支付返回:“支付验证签名失败”


原因分析:

找了各种可能的原因,一一尝试

  1. 检查签名

  2. 检查商户号授权目录、秘钥、关联账号

    • 确认公众号的 baiappSecret 和商户号的 API 密钥没有搞混
    • 重置商户 API 密钥。
    • 确认公众号授权的域名和目录是正确的
  3. 编码方式

  4. 其他参数

  5. demo


解决方案:

上述诸多原因试过来,前后端都有修改,最后顺利解决

  • 后台: 二次签名,中文字符编码,参数确认
  • 前端: 传参数得是 JSON 对象
{
    "appId": data.appId,     //公众号名称,由商户传入
    "timeStamp":data.timeStamp,        //时间戳,自1970年以来的秒数
    "nonceStr":data.nonceStr, //随机串
    "package":data.package,
    "signType":"MD5",         //微信签名方式:
    "paySign":data.paySign //微信签名
},
  • 结果:OK

总结

本章项目代码,主要总结了在微信公号里调起支付,前端代码不多,但是因为最后测功能时,微信报错提示语简单,无法准确定位错误所在,所以跟后端一起排坑,最后顺利解决,所以上述一些bug,还有一些是后端问题,总之,具体做项目时,参照API来,很多bug在字里行间藏着,仔细阅读,仔细比对,实在不行就找度娘,肯定能顺利解决,加油!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uniapp 支付功能可以通过 uni-app 官方提供的插件 uni-payment 来实现,该插件支持微信支付支付支付、银联支付等多种支付方式。 使用步骤: 1. 在 HBuilderX 中打开你的 uniapp 项目,然后在项目的根目录下打开终端,输入以下命令安装 uni-payment 插件: ``` npm install uni-payment --save ``` 2. 在需要使用支付功能的页面中引入 uni-payment 插件: ```javascript import uniPayment from '@/uni_modules/uni-payment/js_sdk/uni-payment.js'; ``` 3. 调用支付方法,例如使用微信支付: ```javascript uniPayment.pay({ provider: 'wxpay', orderInfo: { nonceStr: '随机字符串', package: '统一下单接口返回的 prepay_id 参数值', signType: 'MD5', paySign: '签名', timeStamp: '时间戳' }, success: function (res) { console.log('支付成功:' + JSON.stringify(res)); }, fail: function (err) { console.log('支付失败:' + JSON.stringify(err)); } }); ``` 其中,orderInfo 参数是支付订单信息,需要从后端获取并传递给前端。在微信支付中,orderInfo 参数中需要包含以下字段: - nonceStr:随机字符串,长度为 32 个字符以下。 - package:统一下单接口返回的 prepay_id 参数值。 - signType:签名算法,目前支持 MD5。 - paySign:签名。 - timeStamp:时间戳,单位为秒。 4. 根据需要处理支付成功和支付失败的回调函数。 以上就是 uniapp 支付功能的简单实现步骤。需要注意的是,在使用支付功能时需要保证支付信息的安全性,避免泄露用户的支付信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值