我们在使用golang快速开发微信公众平台(三):定制菜单中已经添加了进入商城的按钮,同时这个按钮在创建的时候也附带有url, 但是你是点不进去的。因为此页面并没有授权。
在开始之前,有几点准备工作:
- 如果在看这篇文章之前,没有详细看过微信网页授权文档,请停下来立刻去看
- 如果你跟我之前一样,压根就对写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参数错误,这已经是很不错的了,后面支付会遇到更让人崩溃的
以上,收工。