我们在使用golang快速开发微信公众平台(三):定制菜单中已经添加了进入商城的按钮,同时这个按钮在创建的时候也附带有url, 但是你是点不进去的。因为此页面并没有授权。
在开始之前,有几点准备工作:
第一步 去项目里加个路由,路由指向的页面要能够在浏览器正常访问 假设当前的地址就是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参数错误,这已经是很不错的了,后面支付会遇到更让人崩溃的
以上,收工。