分享
  1. 首页
  2. 文章

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

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

我们在使用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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏