• 微信支付流程


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

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

    授权回调域名配置规范为全域名并且不带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 

  • 相关阅读:
    C#创建https请求并使用pfx证书 拓荒者
    "类型初始值设定项引发异常" 解决方法 拓荒者
    Web乱码解决方法 拓荒者
    Asp.net Ajax Accordion控件的用法 拓荒者
    【转】最强日期正则表达式 拓荒者
    【转】Http之Get/Post请求区别 拓荒者
    【转】Log4Net五步走 拓荒者
    SqlServer 错误:"SQL Server 无法生成 FRunCM 线程" 解决办法 拓荒者
    log4net用法实例 拓荒者
    Asp.net Ajax Calendar控件用法 拓荒者
  • 原文地址:https://www.cnblogs.com/songdongdong/p/6926315.html
Copyright © 2020-2023  润新知