微信公众号开发之微信支付代码记录的实现


Posted in Javascript onOctober 16, 2019

需求说明

这个需求说明是完全没有必要的,但是还是写一下吧,但凡是做公众号的,一般都是需要了解这个微信支付的,不然基本的业务都没办法走,所以今天简单的记录一下微信支付的一些问题以及流程是怎么样的。记录的是jsapi支付,别的支付方式暂时没有记录,也就是拉起来付款界面的支付。

微信支付产品

https://pay.weixin.qq.com/static/product/product_index.shtml#payment_product

微信开发步骤

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3

这里简单的说一下,我们打开这哥链接以后其实是官方截图的配置,有一个支付配置和设置授权域名
首先是支付配置:最简单的办法是我们打开需要支付的公众号,右上角有三个点,直接复制url,这个url就是这里需要配置的url
至于下面的授权域名,我自己当时是没有进行配置的,这里可能是我疏忽了,但是我没有配置也没有影响我使用,所以这里我不确定要不要配置。

支付接口

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

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();
}

这段是官方的源码,我们是可以直接拿来使用的,这里主要是展示一下腾讯的签名是怎么生成的:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

上面的五个参数其实appid是我们可以拿到的,时间戳是我们直接可以生成的,注意这里是秒数,不是毫秒,随机串这个可以直接自己写一个函数,生成一个32位以内的随机数,prepay_id这是后端提供接口,返回一个预付id,signType是md5加密,无可争议的,最后一个是签名,签名的规则是:

  • 参数名ASCII码从小到大排序(字典序);
  • 如果参数的值为空不参与签名;
  • 参数名区分大小写;
  • 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
  • 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

这个就比较有意思了,我做的时候直接用后端生成好的签名进行的,但是理论上我前端也是可以生成的,但是我失败了,可能是我顺序的问题或者是别的什么问题吧,这个不得而知了。

看源码

废话不说了,既然是记录,就直接贴源码:

  • 步骤很简单:
  • 根据js拿到code
  • 根据code获取openid
  • 根据openid获取到预付id
  • 根据预付id加上一些必要参数拉起支付
  • 判断支付的成功与否进行相应的操作
/**
  * @_fun_jsapi 拉起微信付款的界面
  */
  _fun_jsapi(order_no) {
  let that = this
  let openid = sessionStorage.getItem('openid')
  if (openid && that.timestamp && that.nonceStr) {
   request({
   method: 'post',
   url: Constants.host_jsapi + api.jsapi,
   data: {
    out_trade_no: order_no, //商家订单号
    total_fee: that.account_price * 100,
    product_id: '8501', //所含产品id
    body: '微信公众号订房-颐陆科技', //订单简述 128字符(中文32位)
    detail: '',  //订单详情 60000字符 (中文1500位)
    fee_type: '',  //币种 缺省值CNY
    attach: '',  //用户附加字串,原样返回
    limit_pay: '', //限制字串 例:no_credit 不收信用卡
    goods_tag: '', //订单优惠标记
    openid: openid, //仅在jsapi中会使用
   }
   }).then((res) => {
   //alert(JSON.stringify(res))
   if (res.data.result_code === 'SUCCESS') {
    that.prepay_id = res.data.prepay_id
    that.timestamp = res.data.time_stamp
    that.nonceStr = res.data.nonce_str
    that.paySign = res.data.pay_sign
    that.onBridgeReady()
   } else {
    instance('error')
   }
   }).catch((err) => {
   instance(err);
   //alert(err);
   })
   //instance(sessionStorage.getItem('openid'));
  } else {
   instance('参数获取失败')
  }
  },
  /**
  * @onBridgeReady
  */
  onBridgeReady() {
  let that = this
  WeixinJSBridge.invoke(
   'getBrandWCPayRequest', {
   "appId": "wx7eb8183de8a1311b",  //公众号名称,由商户传入
   "timeStamp": that.timestamp + "", //时间戳,自1970年以来的秒数
   "nonceStr": that.nonceStr, //随机串
   "package": "prepay_id=" + that.prepay_id, //预定单id
   "signType": "MD5", //微信签名方式:
   "paySign": that.paySign//微信签名
   },
   function (res) {
   if (res.err_msg == "get_brand_wcpay_request:ok") {
    //instance('支付成功')
    that.$router.push({path: '/Pay_success'})
   } else if (res.err_msg == "get_brand_wcpay_request:ok") {
    //that.$router.push({path:'/Pay_success'}) 取消支付
    instance('取消支付')
   } else {
    //instance('支付失败')
   }
   })
  },

需要注意的是:微信支付的金额是分为单位的,也就是我们正常的钱需要进行*100的操作

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript模块模式分析
May 16 Javascript
javascript之AJAX框架使用说明
Apr 24 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
Mar 27 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
详解vue.js全局组件和局部组件
Apr 10 Javascript
addEventListener()与removeEventListener()解析
Apr 20 Javascript
详解React Native顶|底部导航使用小技巧
Sep 14 Javascript
浅谈Node框架接入ELK实践总结
Feb 22 Javascript
在node中使用jwt签发与验证token的方法
Apr 03 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
Aug 22 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
Nov 18 Javascript
关于JS模块化的知识点分享
Oct 16 #Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
Oct 16 #Javascript
使用JavaScrip模拟实现仿京东搜索框功能
Oct 16 #Javascript
微信小程序如何实现在线客服功能
Oct 16 #Javascript
Vue 实现从文件中获取文本信息的方法详解
Oct 16 #Javascript
Vue 实现从小到大的横向滑动效果详解
Oct 16 #Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
Oct 16 #jQuery
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
php实现文件预览功能
2017/05/23 PHP
php语法检查的方法总结
2019/01/21 PHP
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现根据月份和日期得到星座的方法
2015/03/27 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Django forms组件的使用教程
2018/10/08 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
自荐信范文
2013/12/10 职场文书
行政办公室岗位职责
2014/03/18 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
材料员岗位职责
2015/02/10 职场文书
杨善洲电影观后感
2015/06/04 职场文书
七年级作文之英语老师
2019/10/28 职场文书