新项目,不论是手机端仍是 PC 端基本上都会有微信登陆、微信支付,甚至还会作一个微信公众号。整个体系庞大,资料也千奇百怪。因此特意总结一篇微信开发的技巧和相应资料来帮助你提升开发效率。php
官方推荐的 PC 端登陆是经过微信开放平台建立应用来实现的。凡是建立的应用都能用下面微信提供的连接来进行扫码受权操做html
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
复制代码
链接中包含如下参数:前端
能够看到 response_type, scope 都是写死的。appid 会在你建立应用的时候给你(固然还有 AppSecret)。state 主要是为了用于验证是不是别人假冒的请求。重点是 redirect_uri。当用户扫码以后微信会重定向当前页面跳转到 redirect_uri 指向的地址。这个连接须要进行 urlEncode 进行重定向。为何须要 urlEncode 对连接进行处理呢,我搜了一些资料总结了俩条我认为最重要的理由:java
对 url 进行编码也很简单,下面的 js 代码直接拷贝便可android
let a = 'http://xuyuechao.top'
// 编码
let b = encodeURIComponent(a)
// 解码
decodeURIComponent(b)
复制代码
这里须要注意别用 encodeURI 。他是不会对 ASCII 字母和数字进行编码的。web
到了这里一个完整的微信受权连接就已经有了,经过 a 连接打开一个新页面或者是经过 js 打开一个新页面均可以。这个受权连接打开的页面会带有一张二维码,这时候用户扫码分为俩种操做:赞成受权和不一样意受权。而他们最大的不一样是跳转到重定向链接的时候是否带有 codeajax
// 用户赞成受权
redirect_uri?code=CODE&state=STATE
// 用户不一样意受权
redirect_uri?state=STATE
复制代码
实现这一步前端的使命基本上已经完成了,由于核心 code 到手剩下的就是后端的事情了,简单描述一下后续步骤:后端
上面的那种是打开新窗口的模式,效果以下图:api
这种方式是强制性跳转到新页面并不友好,因此微信还提供了另一种 JS 的方式,在当前页面打开一个 iframe 窗口来提供整个网站的流畅性。步骤以下:数组
<script>http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
</script>
复制代码
var obj = new WxLogin({
self_redirect:true,
id:"login_container",
appid: "",
scope: "",
redirect_uri: "",
state: "",
style: "",
href: ""
});
复制代码
微信登陆扫码是能够关注公众号的哦,这里就用到了一种很是规登陆方式。优势主要有二:
废话很少说,立刻给你上实现步骤:
能够看到这个方法对于前端来讲更简单,定义一个 img 标签,获取到后端返回的二维码地址将 img 标签的 src 属性修改成这个地址便可。而后开启轮询访问接口。相关资料可参考这篇文章:文章地址
先声明此处特指微信内网页登陆方式
这种方式跟上面提到的 PC 端普通登陆方式基本相似,废话很少说上实现步骤
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
复制代码
只获取用户的 openid 不须要用户受权的静默连接 scope=snsapi_base
须要用户受权,获取用的昵称、性别、所在地 scope=snsapi_userinfo
// 用户赞成受权
redirect_uri?code=CODE&state=STATE
// 用户不一样意受权
redirect_uri?state=STATE
复制代码
注意:redirect_uri 的连接须要在微信提供的白名单里
我的感受微信最麻烦的是概念的理解以及相关文章的查找,这俩个是我在日常开发的时候特别头疼的。当你完成一次的时候概念其实能够变为具体的操做步骤,从上文能够看出不论是 PC 端仍是手机端都是使用微信提供的连接地址,而后用户进行了相应的操做以后进行 redirect_uri 重定向的时候带有 code 完成的。相关文章我已经帮你找好了,在这里在罗列一遍好让你很是容易的找到相关文章:
手机端完成微信支付有俩种方式,一种采用微信支付文章中的支付方式,另一种采用微信公众号提供的支付方式。微信支付提供的支付方式实现比较简单,一样功能也少。我的推荐采用公众号提供的支付方式。
这种支付的重点在于微信内浏览器提供了一个叫 WeixinJSBridge 的全局变量。须要作的是判断是否在微信内。这里送你一个判断手机端环境的方式:
BrowserInfo = {
isAndroid: Boolean(navigator.userAgent.match(/android/ig)),
isIphone: Boolean(navigator.userAgent.match(/iphone|ipod/ig)),
isIpad: Boolean(navigator.userAgent.match(/ipad/ig)),
isWeixin: Boolean(navigator.userAgent.match(/MicroMessenger/ig)),
isAli: Boolean(navigator.userAgent.match(/AlipayClient/ig)),
isPhone: Boolean(/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent))
}
复制代码
好了开始介绍支付步骤
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();
}
复制代码
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,但并不保证它绝对可靠。
}
});
}
复制代码
整个支付流程到此结束,难点主要是 paySign 的签名方式,可是这一步是放在后端的,因此前端要实现这种支付方式仍是异常简单的。在 Java 中 package 这个参数每每会给你用别的名字,由于 package 在 java 中是一个关键字,因此后端无法直接给你返回正好符合格式的对象,这点有点不友好但也不要怪后端哦。 相关文档连接地址: 文档地址
这种支付方式要比上面的流程更复杂,可是功能也多(主要指支付以外的功能)。直接上步骤
// 注意这个是带有版本号的,最好经过下面提供的文章连接用最新的连接地址
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
复制代码
wx.config({
debug: true, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数,能够在pc端打开,参数信息会经过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的惟一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,须要使用的JS接口列表
});
复制代码
wx.ready(function(){
// config信息验证后会执行ready方法,全部接口调用都必须在config接口得到结果以后,config是一个客户端的异步操做,因此若是须要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则能够直接调用,不须要放在ready函数中。
});
复制代码
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的全部使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});
复制代码
相关文档连接地址: 文档地址
这个咋说呢,重点所有在后端,前端要作的事情确实很少,步骤以下:
相关文档连接地址: 文档地址
能够看到整个微信登陆和支付过程并不复杂,可是新手刚开始操做确定会碰到各类问题。其中签名不对是最麻烦的,由于他须要前端提供回调地址,而回调地址的设置又一般不是前端设置的,我这里给出的建议是出现相似问题能够优先查找白名单和回调地址的配置跟前端设置的是否一致。
再安利一波文章中提到的各类链接地址
为了文章更好的完善特意创建了群提供交流环境,固然支付遇到问题也能够进行提问。欢迎扫描下方二维码加群。手机端扫码不便,能够复制微信号进行添加。 xu645352780