【原】开发微信小程序中获取unionId失败——附Golang与PHP示例

前言:话说这个在微信小程序获取union_id真是一个大坑,前来记录一下,避免更多人的入坑;同时提供一段可运行的Golang语言的解密代码(官方提供的代码只有C++、NodeJS、PHP、Python – -)。

前期准备:去腾讯开放平台(open.weixin.qq.com)把相关应用绑定在一起,同时需要进行微信认证(300人民币/年)。

坑一:

小程序开发文档误导,如下图:

通过这种途径是无法获取到unionid的。(我的环境是:一个网页应用,一个小程序,已认证通过,已绑定在同一个主体下。通过调试是无法获取unionid。)

坑二:

如图,通过wx.login是无法获取到union_id的。


那么“正确”的做法是什么呢?请按照如下操作:

1、当通过wx.login获取到code后,发送到后台服务器,此时后台服务器通过请求地址“https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code”得到openid以及session_key。

2、在小程序端调用如下接口:

wx.getUserInfo({
    withCredentials: true,
    success: function (res){
    console.log(res)
}})
在变量res中,会包括“encryptedData”,“iv”变量的值(当然也会包括“userInfo”,“signature”等值,那些不在本文讨论范围之内)。
3、将“encryptedData”,“iv”的值发送到后台服务器,此时后台服务器相当于得到这个用户的“session_key”,“encryptedData”,“iv”这三个值(Base64 编码)。
4、进行对称解密,得到unionId等值。参照如图:

继续阅读【原】开发微信小程序中获取unionId失败——附Golang与PHP示例

【原】关于Go-Mirco如何使用Kafka作为消息队列

前言:其实一开始是打算用RabbitMQ的,不过出现点问题(随机性的),由于赶进度没有进一步搞,于是切换到Kafka。之前的那篇文章我隐藏了,有机会再看看。

本文重点不在Kafka等消息队列的对比与介绍,只关心于Go-Micro框架如何集成Kafka;阅读本文前,请确保您的Go-Micro框架可正常使用,其文档可参考:https://micro.mu/docs/install-guide.html


步骤:

一、引用包,你懂得。

import (

    ...

    "github.com/micro/go-micro/broker"
    "github.com/micro/go-plugins/broker/kafka"

    ....

)

以下以建立Service为例:(Function同理)

二、生产者

1.在main函数中:

service := micro.NewService(
    micro.Name("服务名"),
    micro.Version("0.0.2"),
    micro.Metadata(map[string]string{
        "type": "XXXXX",
    }),
    micro.Broker(kafka.NewBroker(func(o *broker.Options) {
        o.Addrs = config.BrokerURLs
    })),
)

if err := broker.Connect(); err != nil {
    log.Fatal(err.Error())
}

注意:config.BrokerURLs 是[]string 类型的,存放Kafka的IP和端口,例如:

var BrokerURLs = []string{
    0: "192.168.0.33:9092",
}

2.发布事件:

broker.Publish("Topic主题", &broker.Message{
    Header: map[string]string{
        "AAA": "BBBBB",
        "CCCCC": "DDDDDD",
    },
    Body: []byte("消息内容"),
})

三、消费者:

与发布者相似,唯独是订阅事件,如下代码:

broker.Subscribe("Topic主题", func(p broker.Publication) error {
    brokerHeader := p.Message().Header
    aaa := brokerHeader["AAA"]
    bbb := string(p.Message().Body)
})
if err != nil {
    log.Fatal(err.Error())
}

即可。

【原】关于Go-Micro运行时踩过的坑

前言:本文采用的是Go-Micro,自从决定用这套架构后,遇到过不少坑,但相关资料确实不是很多,GitHub上的issues以及文档给了我一些启发,但像我这种刚入Golang的小白来说,还得自己边琢磨边尝试。

GitHub地址:https://github.com/micro/go-micro

文档手册:https://micro.mu/docs/index.html

网上关于微服务的架构以及Go-Micro的介绍有一些,基本百度一下都能找到,这里就简单提一下:go-micro是一个灵活的RPC框架,micro是其管理工具,go-plugins是其可选插件。


可能会遇到的问题:

1、在执行如下命令时,执行失败,因为golang.org/x/下的net等包无法下载。

go get github.com/micro/micro

这是墙的问题,在部署国内设备时出现的问题,即使使用了squid代理,依旧下载失败了,让我很郁闷,于是把自己电脑的文件直接拷贝过去后可用。我原样打包了一份,打包时间2018年2月1日(西八区),未做任何更改,图省事的朋友可以直接:#tar -xzvf x.20180201.tar.gz -C $GOPATH/src/golang.org/x 即可。(注意:请确保$GOPATH环境变量已设置,通常可能是/root/go/)点我下载x.20180201.tar.gz

2、在编写完成一个服务(service)后,可能习惯于使用命令# go run main.go 进行执行,但提醒一下,如果遇到类似如下错误:

# command-line-arguments

./main.go:39:21: undefined: XXXXX

./main.go:67:17: undefined: YYYYY

请执行 # go get “URL/PROJECT/PATH/” 获取一个可执行文件,通过该文件可以直接运行。比如:(来源官方例子)

go get github.com/micro/examples/greeter/srv && srv

开始看到这条命令的时候,没怎么完全看懂其实,不确定这个srv从哪来的,但后来才明白过来,当执行这条命令以后,如果成功执行,则会在$GOPATH/bin/目录下生成一个srv可执行文件,直接运行该文件即可。

3、如果问题2中的命令无法正常执行,请核实你的protobuf是否正确安装,可以执行# protoc –version进行验证。如果未安装,就安装一下吧,传送门在此


本文可能没有啥逻辑性,主要是记录我遇到的几个比较突出的问题,如果有任何意见请留言谢谢。