本文主要解決個人開發者模板消息發送的問題(沒有伺服器,不能操作伺服器的情況) 針對api.weinxin.qq.com不在以下合法功能變數名稱列表內的問題提出的解決方案 ...
主要內容在標題三,老手可直接跳到標題三。
本文主要解決個人開發者模板消息發送的問題(沒有伺服器,不能操作伺服器的情況)
針對api.weinxin.qq.com不在以下合法功能變數名稱列表內的問題提出的解決方案
一、入門
按照以下網址教程註冊一個小程式賬號,安裝開發工具等一併安裝完成。
https://mp.weixin.qq.com/debug/wxadoc/dev/index.html?t=201828
將上圖中的appid和appSecret,複製保存下來,appid可以每次登陸上述網頁查看,但appSecret只有重置。建議appid和appSecret複製粘貼到一個txt文件中,以後經常會用到。利用appid就可以建立小程式了。
在這裡到發送模板消息之間還需要學習,請自行補相關知識。
二、模板信息
以下網址是微信對模板信息的官方解釋,
https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html。
2.1模板發送條件
1、 支付:當用戶在小程式內完成過支付行為,可允許開發者向用戶在7天內推送有限條數的模板消息(1次支付可下發1條,多次支付下發條數獨立,互相不影響)
2、提交表單:當用戶在小程式內發生過提交表單行為且該表單聲明為要發模板消息的,開發者需要向用戶提供服務時,可允許開發者向用戶在7天內推送有限條數的模板消息(1次提交表單可下發1條,多次提交下發條數獨立,相互不影響)
2.2主要步驟為以下三條
步驟1
主要是保存模板ID,建議和appid一樣,複製粘貼到txt文件,保留以備後面使用
步驟2.就是滿足模板信息發送的兩個條件之一。這裡用表單作為示例。
<form bindsubmit="formSubmit" report-submit='true'> //主要是這行代碼要有
<!-- <button form-type='submit'>submit</button> -->
<view class="weui-dialog__btn weui-dialog__btn_default" bindtap="noneWindows">取消</view>
<button loading="{{loading}}" class="weui-dialog__btn weui-dialog__btn_primary" formType="submit">提交</button> //然後在有個按鈕就行了
</view>
</form>
<button type='primary' bindtap='zhuce'>註冊</button> //用來獲取openid的按鈕,openid的內容後續會講解
步驟3 模板信息的發送
按照教程轉到發送模板消息
2.3 模板信息的發送
模板信息的發送分兩步
2.3.1、獲取token
access_token 是全局唯一介面調用憑據,開發者調用各介面時都需使用 access_token,請妥善保存。access_token 的存儲至少要保留512個字元空間。access_token 的有效期目前為2個小時,需定時刷新,重覆獲取將導致上次獲取的 access_token 失效。
公眾平臺的 API 調用所需的 access_token 的使用及生成方式說明:
為了保密 appsecrect,第三方需要一個 access_token 獲取和刷新的中控伺服器。而其他業務邏輯伺服器所使用的 access_token 均來自於該中控伺服器,不應該各自去刷新,否則會造成 access_token 覆蓋而影響業務;
目前 access_token 的有效期通過返回的 expires_in 來傳達,目前是7200秒之內的值。中控伺服器需要根據這個有效時間提前去刷新新 access_token。在刷新過程中,中控伺服器對外輸出的依然是老 access_token,此時公眾平臺後臺會保證在刷新短時間內,新老 access_token 都可用,這保證了第三方業務的平滑過渡;
access_token 的有效時間可能會在未來有調整,所以中控伺服器不僅需要內部定時主動刷新,還需要提供被動刷新 access_token 的介面,這樣便於業務伺服器在 API 調用獲知 access_token 已超時的情況下,可以觸發 access_token 的刷新流程。
開發者可以使用 AppID 和 AppSecret 調用本介面來獲取 access_token。AppID 和 AppSecret 可登錄微信公眾平臺官網-設置-開發設置中獲得(需要已經綁定成為開發者,且帳號沒有異常狀態)。AppSecret 生成後請自行保存,因為在公眾平臺每次生成查看都會導致 AppSecret 被重置。註意調用所有微信介面時均需使用 https 協議。如果第三方不使用中控伺服器,而是選擇各個業務邏輯點各自去刷新 access_token,那麼就可能會產生衝突,導致服務不穩定。
2.3.2 發送模板消息
可以看到發送模板消息,需要首先獲取用戶的openid。
2.4 openid的獲取
下麵轉到openid的獲取
網上都說openid可以調用wx.login函數獲取到code之後獲取openid。下麵網址是wx.login獲取openid的官方介紹。
https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject
如下圖所示,利用介面地址獲取到openid。
將上述地址利用wx.request訪問時,在小程式中會報錯,api.weixin.qq.com不在合法功能變數名稱範圍內等。在之前貌似可以直接通過在小程式後端添加合法功能變數名稱就可以解決,如下圖所示。網上教程大都這樣解釋。但是現在api.weixin.qq.com並添不進去。
但是大多數人都沒有註意後面官方給出的登錄時序圖,從下圖可以看出,上述介面地址是要通過第三方伺服器訪問微信伺服器才能獲得openid的。在小程式中不能直接訪問,所以這就限制了沒有伺服器的開發者,比如我。那麼怎麼辦呢,
三、模板消息解決辦法
在這裡可以選用Bmob的後端雲伺服器。
下麵是Bmob的官方教程
https://docs.bmob.cn/data/wechatApp/b_developdoc/doc/index.html#小程式模板消息
要將上圖中前四部規規矩矩的配置好,並試驗添加一行數據可否正常運行已檢驗Bmob與小程式配置正常。
話不多說 上代碼
Wxml文件代碼:
<form bindsubmit="formSubmit" report-submit='true'> //主要是這行代碼要有
<!-- <button form-type='submit'>submit</button> -->
<view class="weui-dialog__btn weui-dialog__btn_default" bindtap="noneWindows">取消</view>
<button loading="{{loading}}" class="weui-dialog__btn weui-dialog__btn_primary" formType="submit">提交</button> //然後在有個按鈕就行了
</view>
</form>
<button type='primary' bindtap='zhuce'>註冊</button> //用來獲取openid的按鈕,openid的內容後續會講解
Js代碼:
var Bmob = require("../utils/bmob.js");
var common = require("../utils/common.js");//配置按照教程來
Bmob.initialize("這兩個字元串教程裡面有 要保證是自己的 不能複製別人的", "");
var openid;//儲存openid
zhuce:function(){
wx.login({
success:function(res){
if (res.code) {
//發起網路請求
console.log(res.code)
Bmob.User.requestOpenId(res.code, {
success: function (result) {
that.setData({
loading: true,
url: result.openid
})
console.log(result.openid)
openid = result.openid
},
error: function (error) {
// Show the error message somewhere
console.log("Error: " + error.code + " " + error.message);
}
});
} else {
console.log('獲取用戶登錄態失敗!' + res.errMsg)
common.showTip('獲取用戶登錄態失敗!', 'loading');
}
}
})
}
formSubmit: function (e) {
var that = this
console.log(e.detail.formId)
var temp = {
"touser": openid, //
"template_id": "參數template_id為在微信公眾號獲取到的模板Id",
"page": "",//跳轉界面 不填就沒有跳轉
"form_id": e.detail.formId,
"data": {
"first": {
"value": "您好,Restful 失效,請登錄控制台查看。",
"color": "#c00"
},
"keyword1": {
"value": "339208499",
"color": "#173177"
},
"keyword2": {
"value": "339208499",
"color": "#173177"
},
"keyword3": {
"value": "339208499",
"color": "#173177"
},
"remark": {
"value": "如果您十分鐘內再次收到此信息,請及時處理。"
}
},
"emphasis_keyword": ""
}
console.log(temp)
Bmob.sendMessage(temp).then(function (obj) {
console.log('發送成功')
},
function (err) {
common.showTip('失敗' + err)
console.log(err)
});
},
為什麼能解決問題呢,主要是bmob伺服器幫你把你伺服器上的事完成了,bomb向微信伺服器請求openid。
註意要用手機調試運行。開發工具的模擬器獲取到的formId是個模擬值。下麵是我的運行情況
上述內容可能寫的不夠詳盡,內容繁多,多多少少有些疏漏,若存在問題請在評論區評論,或者私戳我[email protected]
技術不易,酌情打賞