go-wx-gateway
هي خدمة بوابة حساب عام WeChat يتم تنفيذها استنادًا إلى go-wx-api.go-wx-gateway
هو برنامج وكيل عكسي لواجهة API لمنصة حساب WeChat الرسمية.go-wx-gateway
بنقل البيانات المتعلقة بواجهة برمجة تطبيقات حساب WeChat العام فحسب، بل تقوم بتفريغ وحزم الحزم التي ترسلها وتستقبلها، بحيث يمكن تحقيق الأعمال التي تقف وراء الوكيل العكسي go-wx-gateway
بشكل مبسط إلى حد كبيرgo-wx-gateway
، تتواصل مع خدمة الأعمال الخلفية من خلال http، ويمكن لأي لغة تدعم خدمة http تنفيذ كود العمل. go-wx-gateway
، يعد تطوير خدمات الحساب العام لـ WeChat بمثابة تطوير لخدمات الويب العادية.go-wx-gateway
go-wx-gateway
بتولي الإدارة الموحدة، وسيقوم go-wx-gateway
بإعادة توجيه معلومات المستخدم وقيمة حالة القائمة إلى خدمة معالجة القائمة.go-wx-gateway
مع ترخيص صفحة الويب، فيمكن للحساب العام أيضًا الإشارة إلى الخدمة التي تحتاجها، ثم نقل الكود الذي تم الحصول عليه go-wx-gateway
مقابل الوصول إلى openId الخاص بالمستخدم للحصول على كامل معلومات المستخدم. بالنسبة لهذه الطريقة، راجع معلومات التكوين "sns-auth2".go-wx-gateway
ورمز الأعمال، وتنسيق البيانات هو JSON. المتطلبات الأساسية: الانتقال إلى الإصدار 1.11.x وما فوق، وتم تثبيت git وmake
أدخل أي مجلد وقم بتنفيذ الأمر
$ git clone https://github.com/rosbit/go-wx-gateway
$ cd go-wx-gateway
$ make
إذا نجح التجميع، فسيتم الحصول على البرنامج القابل للتنفيذ لـ wx-gateway
. يمكنك تنفيذ ./wx-gateway -v
لعرض معلومات البرنامج.
يمكن تنزيل الإصدار الثنائي من Linux مباشرةً من الإصدارات.
هو JSON
على سبيل المثال، يمكن تعديلها من خلال 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
إذا لم يتم تكوين msg-proxy-pass
، فيمكن استخدام wx-gateway
كأداة لتمكين开发/服务器配置
، ويمكن تنفيذ استجابات الصدى من خلال مربعات النص للمستخدمين الذين يتابعون الحسابات العامة، وهي أداة تصحيح أخطاء أساسية للحساب العام تطوير.
التواصل مع msg-proxy-pass
msg-porxy-pass
ببادئة عنوان URL، وستضيف wx-gateway
الرسالة ونوع الحدث إلى النهاية لتكوين عنوان URL كامل. على سبيل المثال:msg-proxy-pass
على http://wx.myhost.com/msghandler
wx-gateway
رسالة نصية للمستخدم، ستقوم بإعادة توجيه الرسالة إلى http://wx.myhost.com/msghandler/msg/text
wx-gateway
حدث انتباه مستخدم جديد، فسوف تقوم بإعادة توجيه الرسالة إلى http://wx.myhost.com/msghandler/event/subscribe
msg
event
من أنواع إعادة التوجيه، text
subscribe
فهما أسماء رسائل أو أحداث محددة. تتوافق جميع الأسماء مع الرسائل المقابلة لمنصة WeChat العامة.POST
، وجميع نتائج الطلب/الاستجابة هي JSON
. يتم تحويل JSON لنص الطلب من تنسيق XML لرسالة واجهة برمجة تطبيقات حساب WeChat الرسمي. بالنسبة لحقول محددة، لا يزال بإمكانك الرجوع إلى واجهة برمجة تطبيقات حساب WeChat الرسمي.msg
نصًا وصورة وصوتًا وفيديو وفيديو قصيرًا وموقعًا ورابطًاevent
CLICK و VIEW و SCAN والاشتراك وإلغاء الاشتراك والموقع و LOCATION و pic_sysphoto و pic_photo_or_album و pic_weixin و scancode_waitmsg و scancode_push و MASSSENDJOBFINISH و TEMPLATESENDJOBFINISHmsg
، text
الاسمعنوان URL: <msg-proxy-pass>/msg/text
نص رسالة الطلب:
{
"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发生错误,则有错误信息,否则该值为空"
}
إجابة
إذا نجحت، يجب أن يكون الرد 200 رسالة، بتنسيق نص الرسالة
{
"type" : " text " ,
"msg" : "需要返回给用户的消息内容"
}
"النوع" يمكن أن يكون "صوت"، "فيديو"، "صورة"، وما إلى ذلك، و"msg" هو "mediaId" المقابل لها.
event
، اسم subscribe
نص رسالة الطلب:
{
"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发生错误,则有错误信息,否则该值为空"
}
إجابة
نفس الرسالة
إذا نجحت، يجب أن يكون الرد 200 رسالة، بتنسيق نص الرسالة
{
"type" : " text " ,
"msg" : "需要返回给用户的消息内容"
}
"النوع" يمكن أن يكون "صوت"، "فيديو"، "صورة"، وما إلى ذلك، و"msg" هو "mediaId" المقابل لها.
event
متجر الفيديو، اسم channels_ec_order_pay
نص رسالة الطلب:
{
"ToUserName" : "视频号小店的id " ,
"FromUserName" : "在视频号小店购物的用户的openId " ,
"CreateTime" : 1556088649 ,
"MsgType" : " event " ,
"Event" : " channels_ec_order_pay " ,
"order_info" : {
"order_id" : 3705115058471208928 , // NOTE: 文档处是字符串,实际返回的整数
"pay_time" : 1658509200
}
}
إجابة
التواصل مع redirect-url
التعامل مع طلبات ترخيص صفحة الويب. للحصول على التكوين ذي الصلة للحساب العام، يرجى الرجوع إلى وثائق WeChat. يحتاج عنوان URL لرد الاتصال فقط إلى اسم المجال الخاص بـ wx-gateway
يقوم redirect-url
بتكوين عنوان URL، مثل
redirect-url
هو http://wx.myhost.com/menu/path/to/redirect
wx-gateway
طلب صفحة ويب، فسوف تقوم بإعادة توجيه الرسالة إلى عنوان URL أعلاه.POST
. يتم تحديد نتيجة الاستجابة بالكامل بواسطة خدمة معالجة إعادة التوجيه وستنعكس نتيجة استجابة HTTP الخاصة بها إلى متصفح الحساب العام. لكي تتلقى wx-gateway
أحداث النقر على القائمة، يجب كتابة عنوان URL بالتنسيق المعتمد من صفحة الويب الخاصة بالحساب الرسمي:
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
بشكل صحيح، يمكنها تلقي أحداث القائمة، والحصول على openId للمستخدم الذي نقر على القائمة من خلال الكود، وإعادة توجيهه إلى redirect-url
طلب تنسيق الرسالة لطلب 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时的错误信息,如果为空表示没有错误"
}
ستتم إعادة توجيه جميع رؤوس ملفات تعريف الارتباط وطلب HTTP إلى redirect-url
، والذي يمكن معالجته وفقًا للاحتياجات
تنسيق رسالة نتيجة الاستجابة
redirect-url
، بما في ذلك