Nach dem WeChat-Entwicklungsdokument, ein Feld form_id
sollte anzeigt werden, wenn eine Vorlagen Nachricht an den Benutzer gesendet wird. Das Problem ist jedoch, dass eine Vorlagen Nachricht für ein entsprechendes Formular nicht alle Anforderungen erfüllen kann. Daher müssen wir die verfügbare form_id
s für die zukünftige Sendungen sammeln.
Nach dem Dokument, ein Formular mit dem Feld report-submit
kann eine gültige form_id
stellen. So können wir eine Unterklasse für button
erstellen, um verfügbare form_id
s zu sammeln.
Wir nennen diese Klasse sbutton
. Codes auf der Mini-Program Seite lesen sich:
<!--sbutton.wxml--> <form bindsubmit="btnClick" report-submit> <button formType="submit"><slot></slot></button> </form>
{ "component": true, "usingComponents": {} }
/* sbutton.wxss */
// sbutton.js Component({ /** * List of component properties */ properties: { }, /** * Initial data of the component */ data: { requested: false, }, /** * List of component methods */ methods: { btnClick: function (e) { let formId = e.detail.formId if ('the formId is a mock one' !== formId && false ===this.data.requested) { // TODO: send formId to the backend // Set this.data.requested to be true when success } this.triggerEvent('Tap', e, {}) } }, })
Danach können wir button
mit sbutton
sicher ersetzen. Zum Beispiel,
<button bindtap="onConfirm">Confirm</button>
könnte ersetzt werden mit
<sbutton bindtap="onConfirm">Confirm</sbutton>
Fügen Sie in der entsprechenden json-Datei der Komponente den usingComponents-Datensatz hinzu, der auf den sbutton
verweist.
{ "usingComponents": { "sbutton": "path/to/your/sbutton" } }
Auf der Server Seite müssen wir form_id
s aufbewahren und die Veraltete bereinigen. Das Beispiel für Golang liest sich
package wechat import ( "errors" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "model/db" "strconv" "time" ) /* WeChat Mini Program Template Message FormId */ type WxTempMsgFormId struct { WxOpenId string FormId string Timestamp int64 } var conn *gorm.DB func init() { var err error conn, err = gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", "db_username", "db_password", "db_host", "db_port", "db_name")) if err != nil { panic(err.Error()) } conn.AutoMigrate(&WxTempMsgFormId{}) go clean_worker() } func FormIdSave(wxOpenId string, formId string) { conn.Save(WxTempMsgFormId{ WxOpenId: wxOpenId, FormId: formId, Timestamp: time.Now().Unix(), }) } func FormIdConsume(wxOpenId string) (string, error) { record := WxTempMsgFormId{WxOpenId: wxOpenId} conn.Where(record).First(&record) if "" != record.FormId { db.Conn.Delete(&record) return record.FormId, nil } else { return "", errors.New("No more available form_id for user " + wxOpenId) } } func clean_worker() { for { threshold := time.Now().Unix() - 3600*24*6 // 6 days ago db.Conn.Where("timestamp < " + strconv.FormatInt(threshold, 10)).Delete(&WxTempMsgFormId{}) time.Sleep(time.Hour * 1) } }
Zu Ende kann man eine Vorlagen Nachricht mit dem gültigen form_id
aus dem Pool senden.