淺析微信支付:微信公衆號網頁授權

本文是【淺析微信支付】系列文章的第四篇,主要講解微信支付前如何獲取獲取網頁授權及用戶信息獲取。

淺析微信支付系列已經更新三篇了喲~,沒有看過的朋友們可以看一下哦。

淺析微信支付:開發前的準備

淺析微信支付:前篇大綱

淺析微信支付:微信支付簡單介紹(小程序、公衆號、App、H5)

1、開發前的準備

首先,如果沒有看過本系列 淺析微信支付:開發前的準備 的朋友需要看一下這篇文章,鏈接在上方;本文需要用到開發前準備中的幾個知識點:設置安全、設置白名單、得到公衆號一系列信息(appidapiKey等);如果需要在本地開發測試,還需要下載 微信開發者工具微信公衆平臺接口測試帳號

下面我們開始進入開發階段。

2、設置測試號相關信息

因爲項目在開發階段的時候,需要本地調試,所以需要使用測試號來驗證代碼是否正確,所以下面會講如何設置測試號相關配置;

首先我們進入 微信公衆平臺接口測試帳號申請 頁面,點擊登錄即可使用微信賬號登錄(一個微信號只有一個測試號)。

登錄後可以進入測試號管理界面,如下:

微信測試號-1

微信測試號-2
微信測試號-3
微信測試號-4

按要求設置上方圖片中的配置,即可減少80%的問題,如果調用時還有其他問題,請到文末添加作爲微信,可進入討論羣和大家一起交流。

3、獲取微信網頁授權

使用以下代碼獲取微信網頁授權:

微信官方js文件:

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js" type="text/javascript"></script>

封裝的微信工具文件weixin_util.js

<script type="text/javascript">

// 微信默認設置配置方法
function weixinConfig(appid, timestamp, noncestr, signature) {
    wx.config({
        debug : false, // 開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
        // debug : true, 
        appId :appid, // 必填,公衆號的唯一標識
        timestamp : timestamp, // 必填,生成簽名的時間戳
        nonceStr : noncestr, // 必填,生成簽名的隨機串
        signature : signature,// 必填,簽名,見附錄1
        jsApiList: [
            'checkJsApi',
            'onMenuShareTimeline',
            'onMenuShareAppMessage',
            'onMenuShareQQ',
            'onMenuShareWeibo',
            'hideMenuItems',
            'showMenuItems',
            'hideAllNonBaseMenuItem',
            'showAllNonBaseMenuItem',
            'chooseWXPay',
        ]
        // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
    });
}

// 獲取用戶的openid
function getBaseInfo(userId, state){
    if (userId === '') {
        //1.獲取到code
        $appid="xxx";
        $redirect_uri=encodeURI("http://127.0.0.1:8888/weixin/auth/authorize.do");//這裏的地址需要http://
        $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+$appid+"&redirect_uri="+$redirect_uri+"&response_type=code&scope=snsapi_userinfo&state=" + state + "#wechat_redirect";
        window.location.href = $url;
    }
}
</script>

調用微信config方法並獲取網頁授權:

<script type="text/javascript">

    // 微信功能配置
    weixinConfig('${appid}',${timestamp},'${noncestr}','${signature}');

    // 用戶授權登陸
    getBaseInfo('${(userId)}' ,'redirect_uri');

</script>

如果訪問頁面路徑,得到以下顯示,就已經成功獲取網頁授權,其他均爲失敗:
微信網頁授權-1

如果出現其他錯誤,需要檢查一下第一步時設置的路徑安全接口、域名是否正確,開啓weixinConfig中的debug模式,看是否爲沒有正確設置功能模塊;如果還不能解決,請到文末看樓主上一篇文章或者添加作者進羣即可。

4、獲取微信用戶信息

這裏說一下上面獲取用戶授權的具體參數:

第一步,獲取config需要的基礎參數:

/**
 * 根據appid獲取wx.config需要的基礎參數
 * @param reqMap requestUrl 請求頁面地址、appid appid
 * @return json
 *
 * @author yclimb
 * @date 2018/9/25
 */
@ApiOperation(value = "微信公衆號|config需要的基礎參數", httpMethod = "POST", notes = "config需要的基礎參數")
@PostMapping("/getSignature")
public AppMessage getSignature(@RequestBody Map<String, String> reqMap) {
    Map<String, Object> map = Maps.newHashMap();
    switch (reqMap.get("appid")) {
        case WXPayConstants.APP_ID:
            map = wxUtils.getSignature(reqMap.get("requestUrl"), reqMap.get("appid"), BaseConstants.WX_MINI_PROGRAM_YUEDIAN_CODE);
            break;
        case WXPayConstants.APP_ID_CHUNBO:
            map = wxUtils.getSignature(reqMap.get("requestUrl"), reqMap.get("appid"), BaseConstants.WX_CHUNBO_JSAPI_YUEDIAN_CODE);
            break;
    }
    return AppMessage.success(map);
}

第二部分:獲取用戶授權的基礎信息:

// 這裏的appid就是咋們測試號的appid
$appid="xxx";

// 這裏的地址需要http://且必須encodeURI,此地址爲獲取用戶信息後,微信自動轉發的服務器端接口,用來接收微信的授權code,在後端處理而得到用戶基本信息
$redirect_uri=encodeURI("http://127.0.0.1:8888/weixin/auth/authorize.do");

// 微信官方的授權接口
$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+$appid+"&redirect_uri="+$redirect_uri+"&response_type=code&scope=snsapi_userinfo&state=" + state + "#wechat_redirect";

// state可以用來區分特殊參數和配置

具體可見微信官方文檔,文檔如下:微信網頁授權接口

以上爲js頁面處理,下面我們來具體講解 redirect_uri 這個接口中需要處理的邏輯;

WXAuthController

/**
 * 微信網頁授權
 * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
 * 第一步:用戶同意授權,獲取code
 * 第二步:通過code換取網頁授權access_token
 * @return str
 *
 * @author yclimb
 * @date 2018/7/30
 */
@ApiOperation(value = "微信用戶|網頁授權", httpMethod = "GET", notes = "獲取前端微信用戶的網頁授權,得到用戶基礎信息")
@GetMapping("/authorize")
public AppMessage authorize(HttpServletRequest request) {

    // 跳轉頁面標識
    String state = request.getParameter("state");
    // 通過code獲取access_token
    String code = request.getParameter("code");
    log.info("authorize:code:{}", code);

    String appid;
    String secret;
    
    // 根據不同的state得到不同的微信公衆號網頁授權
    switch (state) {
        case STATE_ASYD:
            appid = WXPayConstants.APP_ID_ASYD;
            secret = WXPayConstants.SECRET_ASYD;
            break;
        default:
            appid = WXPayConstants.APP_ID_CHUNBO;
            secret = WXPayConstants.SECRET_CHUNBO;
            break;
    }

    // 獲取access_token和openid
    JSONObject jsonToken = wxUtils.getJsapiAccessTokenByCode(code, appid, secret);
    if (null == jsonToken) {
        return AppMessage.error(-2);
    }

    return AppMessage.success(jsonToken);
}

WXUtils


/**
 * 網頁授權獲取用戶信息時用於獲取access_token以及openid
 * 請求路徑:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code(最後一個參數不變)
 *
 * @param code c
 * @return access_token json obj
 * @author yclimb
 * @date 2018/7/30
 */
public JSONObject getJsapiAccessTokenByCode(String code, String appid, String secret) {
    if (StringUtils.isBlank(code)) {
        return null;
    }
    try {
        // 獲取access_token
        String access_token_json = restTemplate.getForObject(WeChatURL.OAUTH_ACCESS_TOKEN_URL, String.class, appid, secret, code);
        logger.info("getJsapiAccessTokenByCode:access_token_json:{}", access_token_json);
        if (StringUtils.isBlank(access_token_json)) {
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(access_token_json);
        if (StringUtils.isBlank(jsonObject.getString("access_token"))) {
            return null;
        }
        return jsonObject;
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }
    return null;
}

使用以上方法就可以得到微信用戶的基礎咯~,上面是作者已經封裝好的sdk方法,具體的源碼請見文末源碼地址。

如果用戶已經授權,第二次進入網頁,這時候不需要再次授權,作者也提供了另一種獲取用戶信息的方法,通過access_token和openid請求獲取用戶信息,代碼如下:

/**
 * 通過access_token和openid請求獲取用戶信息
 * @return str
 *
 * @author yclimb
 * @date 2018/9/17
 */
@ApiOperation(value = "微信用戶|通過access_token和openid請求獲取用戶信息", httpMethod = "POST", notes = "通過access_token和openid請求獲取用戶信息")
@PostMapping("/getXxxUser/{access_token}/{openid}")
public AppMessage getXxxUser(@PathVariable String access_token, @PathVariable String openid) {

    // 通過access_token和openid請求獲取用戶信息
    JSONObject jsonUserinfo = wxUtils.getJsapiUserinfo(access_token, openid);
    if (null == jsonUserinfo) {
        return AppMessage.error(-2);
    }

    // 判斷用戶是否在悅店系統中是一個用戶
    String unionid = jsonUserinfo.getString("unionid");
    if (StringUtils.isBlank(unionid)) {
        return AppMessage.error(61008);
    }

    // 存儲用戶信息到數據庫
    
    // 用戶名稱解碼
    user.setNickName(UserNickUtil.decodeNickName(user.getNickName()));
    
    return AppMessage.success(user);
}

結語

根據以上步驟實現,就可以完成微信授權-用戶信息獲取等操作,如果有問題,歡迎小夥伴隨時交流~

預告:下一篇文章,作者將講 統一下單接口,敬請期待!!!

​如果想要提前一覽源碼的小夥伴,可以先看看我的 github,地址如下: https://github.com/YClimb/wxpay-sdk/blob/master/README.md

加作者私人微信,作者微信號如下 yclimb,標明 微信支付 可拉入微信支付討論羣與小夥伴一起探討哦,一定要標明 微信支付 哦~

到此本文就結束了,關注公衆號查看更多推送!!!


關注我的公衆號


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章