微信支付流程

第一步,配置授权回调页面域名

进入微信公众平台后台后,依次进入开发者中心-权限表,找到网页授权获取用户基本信息,

授权回调域名配置规范为全域名并且不带http,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权。

第二步,用户同意授权,获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。 

尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

参数说明:

示例代码:

function 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;
}
var code = GetQueryString("code");//这里会拿到code
if (!code) {
    location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=你配置的回调域名&response_type=code&scope=snsapi_base&state=#wechat_redirect";
  //应用授权作用域:snsapi_base(用户不可感知)只能获取到openid,snsapi_userinfo(用户可感知的授权方式)弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息 }

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 

第三步:通过code换取网页授权access_token或者openId(这里其实之获取到openId就可以进行下面的操作:具体操作还要看后端接口怎么处理)

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

请求方法:

获取code后,请求以下链接获取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 

这里使用jquery来演示使用code获取openid的过程和获取订单号

//   判断是否获取到了openId
try {
    if (typeof window.sessionStorage.getItem('openId') == 'undefiened') {
        var openId = null;
    } else {
        var openId = JSON.parse(window.sessionStorage.getItem('openId'));
    }
} catch (err) {
    var openId = null;
}

if (openId) {
    addOrder();
} else {
    $.ajax({
        type: 'get',
        dataType: "json",
        url: "换取openid的接口地址?code=" + code,
        success: function (data) {
            if (data.code == 0) {
                openId = data.data.openid;
                window.sessionStorage.setItem('openId', JSON.stringify(openId));
         //这里是用来获取后台返回的订单号的,具体根据实际项目来 addOrder(); }
else { // alert(data.msg) } } }) }

第四步:刷新access_token(如果需要)

由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

请求方法

获取第二步的refresh_token后,请求以下链接获取access_token:  

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 

 

第五步:拉取用户信息(需scope为 snsapi_userinfo)

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法:

http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 

附:检验授权凭证(access_token)是否有效

请求方法:

http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID 

原文地址:https://www.cnblogs.com/songdongdong/p/6926315.html