go-wx-gateway
es un servicio de puerta de enlace de cuentas públicas de WeChat implementado en base a go-wx-api.go-wx-gateway
es un programa de proxy inverso para la interfaz API de la plataforma de cuenta oficial WeChat.go-wx-gateway
no simplemente transfiere los datos relacionados con la API de la cuenta pública de WeChat, sino que descomprime y empaqueta los paquetes que envía y recibe, de modo que el negocio detrás del proxy inverso go-wx-gateway
se puede simplificar enormemente.go-wx-gateway
, se comunica con el servicio empresarial back-end a través de http y cualquier idioma que admita el servicio http puede implementar el código empresarial. go-wx-gateway
, el desarrollo de los servicios de cuentas públicas de WeChat es el desarrollo de servicios web ordinarios.go-wx-gateway
go-wx-gateway
go-wx-gateway
se haga cargo de ella y reenviará la información del usuario y el valor del estado del menú al servicio de procesamiento del menú.go-wx-gateway
maneje la autorización de la página web, la cuenta oficial también puede señalar el servicio que necesita y luego transferir el código obtenido go-wx-gateway
a cambio de acceder al openId del usuario para obtenerlo completo. información del usuario. Para este método, consulte la información de configuración "sns-auth2".go-wx-gateway
y el código comercial, y el formato de datos es JSON. Requisito previo: vaya a 1.11.x y superior, se hayan instalado git y make
Ingrese a cualquier carpeta y ejecute el comando
$ git clone https://github.com/rosbit/go-wx-gateway
$ cd go-wx-gateway
$ make
Si la compilación es exitosa, se obtendrá el programa ejecutable de wx-gateway
. Puede ejecutar ./wx-gateway -v
para mostrar información del programa.
La versión binaria de Linux se puede descargar directamente desde las versiones.
es un JSON
Ejemplo, se puede modificar a través de sample.conf.json
:
{
"listen-host" : " " ,
"listen-port" : 7080 ,
"services" : [
{
"name" : "一个名字,随便取" ,
"workerNum" : 5 ,
"timeout" : 0 ,
"wx-params" : {
"token" : "开发/服务器配置中的Token " ,
"app-id" : "开发/公众号开发信息中的AppId " ,
"app-secret" : "开发/公众号开发信息中的AppSecret " ,
"aes-key" : "开发/服务器配置中的EncodingAESKey。如果是明文传输,则该串为空或null "
},
"listen-endpoints" : {
"service-path" : " /wx --开发/服务器配置/服务器地址中的路径部分" ,
"redirect-path" : " /redirect --这个是微信网页授权用到的,设置菜单时都用这个路径,可选"
},
"msg-proxy-pass" : " http://yourhost.or.ip.here --这个地址指向消息/事件处理的服务,如果不处理可以为空" ,
"redirect-url" : " http://yourhost.or.ip/path/to/redirect --完全转发http请求,响应将返回微信服务号,可选" ,
"redirect-userinfo-flag" : "如果通过 snsapi_userinfo 获取参数,在redrect-url中加上特殊字符串参数,用于区分,比如 login。如果为空,使用 snsapi_base 方式获取用户参数"
},
{
"name" : "如果有其它的公众号服务,可以参考上面的信息配置" ,
"注意" : " listen-endpoints中的路径 不能 相同" ,
"视频号小店支持" : "如果是视频号小店,加上 " is-channels-ec " : true 配置项,其中的 " msg-proxy-pass " 配置的是接收视频号小店推送的事件"
}
],
"token-cache-dir" : "缓存access的根路径,这是可选的配置" ,
"common-endpoints" : {
"health-check" : " /health --这是可选的配置,用于http健康检查,该路由配置成内部可访问" ,
"wx-qr" : " /qr --这是可选的路由配置,可以配置成内部可访问的,用于生成微信二维码链接" ,
"wx-qr的参数说明" : " s=<服务名,对应services中的name>&t=temp|forever[&sceneid=<场景id>][&e=<t为temp时的有效秒数>] " ,
"wx-user" : " /user --这是可选的路由配置,可以配置成内部可访问的,用于获取用户信息,参数:s=<服务名>&o=<openId> " ,
"sns-auth2" : " /sns-auth2 -- 这是可选的路由配置,如果网页授权由其它服务接收,可以通过网页授权参数code获取用户信息" ,
"sns-auth2参数说明" : " s=<服务名,对应services中的name>&code=<网页授权得到的code>&[scope=userinfo|base|snsapi_userinfo|snsn_api_base] " ,
"short-url" : " /short-url -- 这是可选的路由配置,用于把长url生成短链接。【注】微信已经停止该服务" ,
"short-url参数说明" : "访问方法POST, POST body: s=<服务名,对应services中的name>&u=<url编码的长URL> " ,
"tmpl-msg" : " /tmpl-msg -- 这是可选的路由配置,用于发送模版消息" ,
"tmpl-msg参数说明" : "访问方法POST, POST body是JSON " ,
"tmpl-msg body例子" : { "s" : "服务名,对应services中的name " , "to" : "用户openid " , "tid" : "模版id " , "url" : "可选,跳转url " , "mp" :{ "说明" : "可选的小程序参数" , "appid" : "小程序appid " , "pagepath" : "页面路径" }, "data" :{ "模版数据key" : "数据" , "数据key2" : " ... " }},
"sign-jsapi" : " /sign-jsapi -- 这是可选的路由配置,用于生产jsapi签名" ,
"sign-jsapi参数说明" : "访问方法POST, POST body: s=<service-name-in-conf>&u=<url-calling-jsapi-in-urlencoding>,结果会返回noncestr, timestamp, signature等结果" ,
"channels-ec-order-detail" : " /channles-ec-order-detail -- 可选,用于获取视频号小店订单详情" ,
"channels-ec-order-detail参数说明" : " s=<服务名,对应services中的name>&o=<订单id> " ,
"channels-ec-refund-detail" : " /channels-ec-refund-detail -- 可选,用于获取视频号小店售后单详情" ,
"channels-ec-refund-detail参数说明" : " s=<服务名,对应services中的name>&o=<售后订单id> " ,
},
"dont-append-userinfo" : " true|false, 各种消息事件是否不增加用户信息,缺省是false,表示追加"
}
$ CONF_FILE=./wx-gateway-conf.json ./wx-gateway
Si msg-proxy-pass
no está configurado, wx-gateway
se puede utilizar como herramienta para habilitar开发/服务器配置
y puede implementar respuestas de eco a través de cuadros de texto para los usuarios que siguen cuentas públicas. Es una herramienta de depuración esencial para cuentas públicas. desarrollo.
Comunicación con msg-proxy-pass
msg-porxy-pass
está configurado con un prefijo de dirección URL wx-gateway
agregará el mensaje y el tipo de evento al final para formar una URL completa. Por ejemplo:msg-proxy-pass
está configurado en http://wx.myhost.com/msghandler
wx-gateway
recibe el mensaje de texto del usuario, reenviará el mensaje a http://wx.myhost.com/msghandler/msg/text
wx-gateway
recibe un evento de atención de un nuevo usuario, reenviará el mensaje a http://wx.myhost.com/msghandler/event/subscribe
msg
y event
son tipos de reenvío, text
y subscribe
son nombres de mensajes o eventos específicos. Todos los nombres corresponden a los mensajes correspondientes a la plataforma pública WeChat.POST
y todos los resultados de la solicitud/respuesta son JSON
. El JSON del cuerpo de la solicitud se convierte del formato XML del mensaje API de la cuenta oficial de WeChat. Para campos específicos, aún puede consultar la API de la cuenta oficial de WeChat.msg
incluyen texto , imagen , voz , video , video corto , ubicación y enlace.event
incluyen HACER CLIC , VER , ESCANEAR , suscribirse , darse de baja , ubicación , UBICACIÓN , pic_sysphoto , pic_photo_or_album , pic_weixin , scancode_waitmsg , scancode_push , MASSSENDJOBFINISH , TEMPLATESENDJOBFINISHmsg
, text
de nombreURL: <msg-proxy-pass>/msg/text
Cuerpo del mensaje de solicitud:
{
"ToUserName" : "公众号的id " ,
"FromUserName" : "发送消息的用户的openId " ,
"CreateTime" : 1556088649 ,
"MsgType" : " text " ,
"Content" : "用户发送的文本内容" ,
"MsgId" : " 22277834746191186 " ,
"说明" : "以上为必传信息,如果配置文件中dont-append-userinfo为false,则有下面的信息" ,
"userInfo" : {
"openid" : " " ,
"nickname" : " " ,
"headimgurl" : " " ,
"city" : " " , "province" : " " , "country" : " " ,
"sex" : 1 ,
"language" : " " ,
"等等" : "各种信息"
},
"userInfoError" : "如果取userInfo发生错误,则有错误信息,否则该值为空"
}
respuesta
Si tiene éxito, debe ser una respuesta de 200 mensajes, formato de cuerpo del mensaje.
{
"type" : " text " ,
"msg" : "需要返回给用户的消息内容"
}
"tipo" puede ser "voz", "vídeo", "imagen", etc., y "msg" es su correspondiente "mediaId"
event
, nombre subscribe
Cuerpo del mensaje de solicitud:
{
"ToUserName" : "公众号的id " ,
"FromUserName" : "关注公众号的用户的openId " ,
"CreateTime" : 1556088649 ,
"MsgType" : " event " ,
"Event" : " subscribe " ,
"EventKey" : " qrscene_场景ID(新关注) 或 场景ID(扫码) " ,
"Ticket" : "如果是二维码扫码,是二维码的票据" ,
"说明" : "以上为必传信息,如果配置文件中dont-append-userinfo为false,则有下面的信息" ,
"userInfo" : {
"openid" : " " ,
"nickname" : " " ,
"headimgurl" : " " ,
"city" : " " , "province" : " " , "country" : " " ,
"sex" : 1 ,
"language" : " " ,
"等等" : "各种信息"
},
"userInfoError" : "如果取userInfo发生错误,则有错误信息,否则该值为空"
}
respuesta
igual que el mensaje
Si tiene éxito, debe ser una respuesta de 200 mensajes, formato de cuerpo del mensaje.
{
"type" : " text " ,
"msg" : "需要返回给用户的消息内容"
}
"tipo" puede ser "voz", "vídeo", "imagen", etc., y "msg" es su correspondiente "mediaId"
event
de tienda de videos, nombre channels_ec_order_pay
Cuerpo del mensaje de solicitud:
{
"ToUserName" : "视频号小店的id " ,
"FromUserName" : "在视频号小店购物的用户的openId " ,
"CreateTime" : 1556088649 ,
"MsgType" : " event " ,
"Event" : " channels_ec_order_pay " ,
"order_info" : {
"order_id" : 3705115058471208928 , // NOTE: 文档处是字符串,实际返回的整数
"pay_time" : 1658509200
}
}
respuesta
Comunicación con redirect-url
Gestionar solicitudes de autorización de páginas web. Para la configuración relevante de la cuenta pública, consulte la documentación de WeChat. La URL de devolución de llamada solo necesita el nombre de dominio donde se encuentra wx-gateway
redirect-url
configura una URL, como
redirect-url
es http://wx.myhost.com/menu/path/to/redirect
wx-gateway
recibe una solicitud de página web, reenviará el mensaje a la URL anteriorPOST
. El resultado de la respuesta lo determina completamente el servicio de procesamiento de reenvío. El resultado de la respuesta HTTP se reflejará en el navegador de la cuenta pública. Para que wx-gateway
reciba eventos de clic en el menú, la URL debe escribirse en el formato autorizado por la página web de la cuenta oficial:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=在这里填公众号的AppId&redirect_uri=http%3A//wx.myhost.com/这是redirect-path配置的值&response_type=code&scope=snsapi_base&state=这个值用于区分菜单项#wechat_redirect
wx-gateway
está configurado correctamente puede recibir eventos del menú, obtener el openId del usuario que hizo clic en el menú a través del código y reenviarlo a redirect-url
Solicitar formato de mensaje para solicitar redirect-url
{
"requestURI" : "转发请求的URI,这是微信服务器访问gateway的URI,可以根据实际情况做进一步判断" ,
"appId" : "公众号的AppId,如果同时处理多个公众号,可以用来区分来源" ,
"openId" : "点击菜单的用户的openId " ,
"state" : "在菜单配置中的state的值,用于区分菜单项" ,
"userInfo" : {
"subscribe" : 1 ,
"openid" : " " ,
"nickname" : " " ,
"sex" : 1 ,
"language" : " " ,
"province" : " " ,
"city" : " " ,
"country" : " " ,
"headimgurl" : " " ,
"subscribe_time" : 1386160805 ,
},
"userInfoError" : "请求userInfo时的错误信息,如果为空表示没有错误"
}
Todos los encabezados de solicitud HTTP y las cookies se reenviarán a redirect-url
, que se puede procesar según las necesidades.
Formato del mensaje de resultado de respuesta
redirect-url
, incluido