使用golang快速开发微信公众平台(四):网页授权

u012210379 · · 6853 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

我们在使用golang快速开发微信公众平台(三):定制菜单中已经添加了进入商城的按钮,同时这个按钮在创建的时候也附带有url, 但是你是点不进去的。因为此页面并没有授权。

在开始之前,有几点准备工作:

  1. 如果在看这篇文章之前,没有详细看过微信网页授权文档,请停下来立刻去看
  2. 如果你跟我之前一样,压根就对写web页面不感冒,把文档看吐了都没看出个所以然来,就可以接着往下看了

第一步 去项目里加个路由,路由指向的页面要能够在浏览器正常访问 假设当前的地址就是http://www.baidu.com/wx_index

添加路由

这里写图片描述

渲染页面

这里写图片描述

手动在浏览器敲地址

这里写图片描述

第二步 修改使用golang快速开发微信公众平台(三):定制菜单中进入商城的url 使二者一致

这里写图片描述

第三步 添加网页授权回调域名

这里写图片描述

关于这个域名咋填,如果你的域名是http://www.baidu.com 那你就填成www.baidu.com 够直白了吧

下面是见证奇迹的时刻

注意这里scope=snsapi_base,可能与你的不同

GetWxIdInWxShop.go

package GetWxIdInWxShop

import (
    "strings"
    "github.com/astaxie/beego"
    "net/http"
    "fmt"
    "io/ioutil"
    "bytes"
    "encoding/json"
    "github.com/astaxie/beego/context"
    "net/url"

    "rbearserver/models"
    "github.com/astaxie/beego/orm"
    "rbearserver/shopUtils/logUtils"
)

//subUrl 是类似于 /user_view /wx_user_edit 这样的 具体可以到router查阅
//思路是 先通过OAuth2来获取code 然后再根据code获取 openid 最后重定向至本页
func GetWxId(c *context.Context, subUrl string) (openid string) {

    wxbase := models.WxBase{Id:1}
    err := orm.NewOrm().Read(&wxbase, "id")
    if err != nil {
        fmt.Println("读取WxBase失败", err)
        logUtils.GetLog().Error("读取WxBase失败", err)
        return ""
    }

    if code := c.Input.Query("code"); code == "" {

        encodUrl := url.QueryEscape(beego.AppConfig.String("baseURL") + subUrl)
        urlStr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
            wxbase.AppID + "&redirect_uri=" + encodUrl +
            "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"

        c.Redirect(302, urlStr)
    } else {
        if sn, err := getWxOpendidFromoauth2(code, wxbase.AppID, wxbase.AppSecret); err == nil {
            openid = sn.Openid
        }
    }

    return
}

func getWxOpendidFromoauth2(code, appid, secret string) (*models.SnsapiBase, error) {

    requestLine := strings.Join([]string{"https://api.weixin.qq.com/sns/oauth2/access_token",
        "?appid=", appid,
        "&secret=", secret,
        "&code=", code,
        "&grant_type=authorization_code"}, "")

    resp, err := http.Get(requestLine)
    if err != nil || resp.StatusCode != http.StatusOK {
        fmt.Println("发送get请求获取 openid 错误", err)
        logUtils.GetLog().Error("发送get请求获取 openid 错误", err)
        return nil, err
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("发送get请求获取 openid 读取返回body错误", err)
        logUtils.GetLog().Error("发送get请求获取 openid 读取返回body错误", err)
        return nil, err
    }
    if bytes.Contains(body, []byte("errcode")) {

        ater := models.AccessTokenErrorResponse{}
        err = json.Unmarshal(body, &ater)

        if err != nil {
            fmt.Printf("发送get请求获取 openid 的错误信息 %+v\n", ater)
            logUtils.GetLog().Error("发送get请求获取 openid 的错误信息 %+v\n", ater)
            return nil, err
        }
        return nil, fmt.Errorf("%s", ater.Errmsg)

    } else {
        atr := models.SnsapiBase{}
        err = json.Unmarshal(body, &atr)
        if err != nil {
            fmt.Println("发送get请求获取 openid 返回数据json解析错误", err)
            logUtils.GetLog().Error("发送get请求获取 openid 返回数据json解析错误", err)
            return nil, err
        }
        return &atr, nil
    }
}

而之前的渲染页面则变成了这个样子

这里写图片描述

我们打开微信的web开发工具 输入这个url看一看(要求先绑定开发者微信)

这里写图片描述

这里写图片描述

注意 : redirect_uri的参数要求使用urlencode对链接进行处理,这里的链接 是形如 http://www.baidu.cn/xxxx 这样的 必须带 www 必须带http:// 少了会报redirect_uri参数错误,这已经是很不错的了,后面支付会遇到更让人崩溃的

以上,收工。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u012210379

查看原文:使用golang快速开发微信公众平台(四):网页授权

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6853 次点击  
加入收藏 微博
1 回复  |  直到 2019-07-23 15:50:31
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传