Vorlagen Nachrichten in WeChat Mini-Program senden

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_ids 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_ids 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_ids 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.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .