首先,在公众号后台配置h5页面地址

开发流程

1.通过配置h5地址,获取code。再通过code,获取openid

getOpenid(){
  let url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx697881XXXXXXXX&redirect_uri=https://XXXXX.com&response_type=code&scope=snsapi_userinfo&state=access#wechat_redirect'
  let self = this;   
  let access_code=this.GetQueryString('code');   
  let local = window.location.href;   
  if (access_code == null) {     
    window.location.href = url;   
  } else {     
    self.curCode = access_code;     
    self.$axios.get(self.baseUrl+'/api/weixin/openid/'+ self.curCode).then(res =>{       
      if(res.data.data.openid == ''){         
        window.location.href = url;
      }       
      self.openid = res.data.data.openid;
      self.token = res.data.data.token;
      localStorage.setItem('openid',self.openid);
      self.getCerList();     
    })   
  }
},
GetQueryString(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg)
if(r!=null)return unescape(r[2]); return null;
}
 

将获取到的openid和token保存起来(有时获取的openid为空,可以重新再获取一遍)

2.提交支付,获取 prepay_id 和 appid

   saveForm: function () {
var self = this;
if(!self.checkForm()){
self.$toast.center('输入有误,请检查');
return false;
}
var data = {
cert_id:self.curCertId,
cert_name:self.curCertName,
cert_type:0,
wechat_id: localStorage.openid
}
self.$axios({
method:"post",
url:self.baseUrl+'/api/v1/weixin/applicants/users',
headers:{
'Content-Type': 'application/json'
},
data:data,
}).then((res)=>{
if(res.data.success){
self.getOrderMsg();
}else{
self.$toast.center(res.data.msg);
}
})
},
getOrderMsg(){
let self = this;
let openid = localStorage.getItem('openid');
self.$axios({
method:"get",
url:self.baseUrl+'/api/v1/weixin/wxorder/'+ openid +'/'+ self.curCertId,
}).then((res)=>{
if(res.data.success){
let data = res.data.data;
let price = data.price;
if(price == 0){//免费
this.$router.push({path:'/Wait'});
}else{
let appid = data.appid;
let prepayid = data.prepay_id;
let name = data.name;
let apikey = data.apikey;
let orderid = data.orderid; this.$router.push({path:'/Order',query:{appid:appid,prepayid:prepayid,price:price,name:name,orderid:orderid,apikey:apikey}});
} }else{
self.$toast.center(res.data.msg);
}
}) },

3.参见 微信开发文档,逐一获得相关参数

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

data() {
return {
prepayid:'',
price:'',
name:'',
orderid:'',
apikey:'', timestamp:'',
time:0,
orderData:{
appId:'',
nonceStr:'',
package:'',
signType:'MD5',
timeStamp:'',
},
paySign:'',
}
}
  getParams: function(){
var self = this;
self.orderData.appId = self.$route.query.appid;
self.orderData.package = 'prepay_id=' + self.$route.query.prepayid;
self.price = Number(self.$route.query.price)/100;
self.name = self.$route.query.name;
self.orderid = self.$route.query.orderid;
self.apikey = self.$route.query.apikey; self.getOrderData();
},
getOrderData(){
this.getTimeStamp();//获取时间戳
this.orderData.nonceStr = this.getNonceStr(32);//获取32位随机数
this.getPaySign(this.orderData);//生成签名
},

获取时间戳参数

getTimeStamp(){
const DATE = new Date();
this.orderData.timeStamp = Date.parse(DATE)/1000 + '';//秒数 例如:1414561699
this.time = this.formatDate();
}
    formatDate() {//时间格式
let date = new Date();
let y = date.getFullYear();
let MM = date.getMonth() + 1;
MM = MM < 10 ? ('0' + MM) : MM;
let d = date.getDate();
d = d < 10 ? ('0' + d) : d;
let h = date.getHours();
h = h < 10 ? ('0' + h) : h;
let m = date.getMinutes();
m = m < 10 ? ('0' + m) : m;
let s = date.getSeconds();
s = s < 10 ? ('0' + s) : s;
return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
}

获取随机数参数

  getNonceStr(n){//生成 n 位随机数
let chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
let res = "";
for(let i = 0; i < n; i++) {
let id = Math.ceil(Math.random() * 35);
res += chars[id];
}
return res; }

生成签名

    getPaySign(obj){
let self = this;
const params = [];
Object.keys(obj).forEach((key) => {
let value = obj[key]
// 如果值为undefined我们将其置空
if (typeof value === 'undefined') {
value = ''
}
// 对于需要编码的文本(比如说中文)我们要进行编码
// params.push([key, encodeURIComponent(value)].join('='))
params.push([key, value].join('='))
})
let stringA = params.join('&');
let stringSingTemp = stringA + '&key='+self.apikey;
let sign = md5(stringSingTemp).toUpperCase();
self.paySign = sign;
var testparams = {
"appId":self.orderData.appId, //公众号名称,由商户传入
"timeStamp":self.orderData.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":self.orderData.nonceStr, //随机串
"package": self.orderData.package,
"signType":self.orderData.signType, //微信签名方式:
"paySign":self.paySign, //微信签名
'key':self.apikey
} }

可以通过 签名校验工具 进行验证

4.调起微信支付接口

    pay(){
let self = this;
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady',self.onBridgeReady,false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', self.onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', self.onBridgeReady);
}
}else{
self.onBridgeReady();
} },
   onBridgeReady(){
let self = this;
var params = {
"appId":self.orderData.appId,//公众号名称,由商户传入
"timeStamp":self.orderData.timeStamp,//时间戳,自1970年以来的秒数
"nonceStr":self.orderData.nonceStr,//随机串
"package": self.orderData.package,
"signType":self.orderData.signType,//微信签名方式:MD5
"paySign":self.paySign,//微信签名
};
WeixinJSBridge.invoke('getBrandWCPayRequest',params ,function(res){
if(res.err_msg == "get_brand_wcpay_request:ok"){
self.$router.push('/Wait');
}else if(res.err_msg == "get_brand_wcpay_request:cancel"){
self.$toast.center('取消支付!');
}else{
alert(JSON.stringify(res));
}
});
},

这是调起支付密码页面

支付成功后跳转到wait等待页面

Vue — 微信公众号内置h5支付相关的更多相关文章

  1. 微信公众号内唤起h5支付详解

    1.调用统一下单的接口URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder 2.调用统一下单必传参数: appid:需要进行支付功能的公众号的app ...

  2. 微信公众号内H5调用微信支付国内服务商模式

    最近在折微信公众号内H5用JSAPI调用微信支付,境内服务商版支付,微信支付给出的官方文档以及SDK不够详细,导至我们走了一些弯路,把他分享出来,我这边主要是用PHP开发,所以未加说的话示例都是PHP ...

  3. vue微信公众号、H5微信支付

    1.H5微信支付 后台会返回一个URL,前端直接跳转就OK(需要你传给后台一个ip,必须保证在同一域名下) 使用window.location.href =res.data;进行页面跳转到支付界面(r ...

  4. JAVA微信支付——微信公众号内支付 代码

    官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 微信PC二维码支付方式参考:https://www.cnblogs. ...

  5. 微信公众号中的支付宝支付与微信支付 && 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  6. asp.net mvc下实现微信公众号(JsApi)支付介绍

    本文主要讲解asp.net mvc框架下公众号支付如何实现,公众号支付主要包括三个核心代码,前台调起支付js代码.对应js调用参数参数生成代码.支付成功处理代码. 一.微信支付方式介绍 微信提供了各种 ...

  7. 关于微信公众号内嵌网页的几个meta标签

    最近在做微信公众平台内嵌app,其实也就是web app="=,不过就是基于微信内置浏览器(safari加了一个WeixinJS对象),稍微记一下几个html的meta标签(web app通 ...

  8. 微信公众号开发之H5页面跳转到指定的小程序

    前言: 最近公司有一个这样的需要,需要从我们在现有的公众号H5页面中加一个跳转到第三方小程序的按钮.之前只知道小程序之间是可以相互跳转的,今天查阅了下微信开发文档原来现在H5网页也支持小程序之间的跳转 ...

  9. nodejs vue 微信公众号开发(二)申请微信测试号

    1.打开微信测试公众号开发平台http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 扫码登陆

随机推荐

  1. 数据库连接(1)-从JDBC到MyBatis

    摘要 因为有持久层框架,和Spring的存在,越来越多的人对数据库连接这块不甚了解,只知使用方便,不知其原理.所以写一个数据库连接的系列文章,总结下本人在数据库连接方面遇到的问题,和对数据库连接的理解 ...

  2. 【Python语言】--Crontab结合Python脚本实现将日志每天写入到文件中

    一.前述 实际工作中将Python脚本每天定时写入到日志文件中的使用场景还是蛮多的,有很多种方法可以实现这种效果.本文选择一种方式实现,特将实现细节做如下分享,不当之处烦请指正. 二.具体 1.pyt ...

  3. Vue.js-03:第三章 - 事件修饰符的使用

    一.前言 熟悉了 Vue 的指令系统后,在实际开发中,不可避免的会使用到对于事件的操作,如何处理 DOM 事件流,成为我们必须要掌握的技能.不同于传统的前端开发,在 Vue 中给我们提供了事件修饰符这 ...

  4. Elasticsearch Java高级客户端

    1.  概述 Java REST Client 有两种风格: Java Low Level REST Client :用于Elasticsearch的官方低级客户端.它允许通过http与Elastic ...

  5. AlertConfirmDialog【基于AlertDialog的确认取消对话框】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 确认取消对话框,基于AlertDialog.不是基于DialogFragment. 按钮文本可以根据实际情况更换. 效果图 代码分析 ...

  6. Flink重启策略

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  7. Intellij Idea 2018常用快捷键总结

    快捷键列表Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如 ...

  8. dbutils工具类使用

    1DBUtils工具类 1.1概述 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码 DBUtils三个核心功 ...

  9. 洛谷P3366 【模板】最小生成树(Boruvka算法)

    题意 题目链接 Sol 自己yy着写了一下Boruvka算法. 算法思想很简单,就是每次贪心的用两个联通块之间最小的边去合并. 复杂度\(O(n \log n)\),然鹅没有Kruskal跑的快,但是 ...

  10. Android Studio 3.0+ Annotation processors must be explicitly declared now

    把Android Studio 升级到3.0+ 版本的时候出现该问题:   可以看到 给了我们两种解决办法:   1. 即 给出现问题的三方 加上 annotationProcessor配置     ...