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

前端之家收集整理的这篇文章主要介绍了使用golang快速开发微信公众平台(四):网页授权前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们在使用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=","&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
    }
    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参数错误,这已经是很不错的了,后面支付会遇到更让人崩溃的

以上,收工。

原文链接:https://www.f2er.com/go/189328.html

猜你在找的Go相关文章