Proyek Wechattty adalah kerangka pengembangan berbasis JAVA untuk akun publik WeChat (termasuk akun layanan dan akun berlangganan) dan akun perusahaan WeChat yang dikemas dengan baik memungkinkan pengembang untuk fokus pada pengembangan logika bisnis dan meningkatkan efisiensi pengembangan.
Maven digunakan di sini untuk memperkenalkan dependensi.
<dependency>
<groupId>space.chensheng.wechatty</groupId>
<artifactId>wechatty-mp</artifactId>
<version>2.0.0</version>
</dependency>
MpAppContext
adalah pintu masuk panggilan terpadu dari API akun publik, yang diinisialisasi menggunakan WechatMpBootstrap
.
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
MpAppContext mpAppContext = bootstrap.build();
Jika proyek dikelola menggunakan pegas, FactoryBean
dapat diimplementasikan untuk menginisialisasi MpAppContext
untuk referensi selanjutnya.
@Component
public class MpAppContextFactoryBean implements FactoryBean<MpAppContext> {
@Override
public MpAppContext getObject() throws Exception {
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
return bootstrap.build();
}
@Override
public Class<?> getObjectType() {
return MpAppContext.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
Ada dua metode konfigurasi, satu adalah配置文件
dan yang lainnya adalah JAVA代码配置
. Prioritas JAVA代码配置
lebih tinggi daripada配置文件
.
Buat file konfigurasi baru wechat-mp.properties dan letakkan file di jalur kelas proyek. Misalnya, dalam proyek pakar, file ini dapat ditempatkan di direktori src/main/resources
. Konfigurasi umumnya adalah sebagai berikut:
token=thisIsToken
aesKey=thisIsAesKey
appId=thisIsYourAppId
appSecret=thisIsAppSecret
Ketika MpAppConetxt
diinisialisasi, panggil metode customizeWechatContext
dari WechatMpBootstrap
untuk konfigurasi.
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.customizeWechatContext(new MpWechatContextCustomizer() {
@Override
public void customize(MpWechatContext wechatContext) {
wechatContext.setToken("thisIsToken");
wechatContext.setAesKey("thisIsAeskey");
wechatContext.setAppId("thisIsAppId");
wechatContext.setAppSecret("thisIsAppSecret");
}
});
Parameter yang diperlukan | menjelaskan |
---|---|
token | Token akun resmi dapat dilihat di latar belakang akun resmi. |
aesKey | Kunci yang digunakan untuk enkripsi dapat dilihat di backend akun resmi. |
appId | AppId akun resmi dapat dilihat di latar belakang akun resmi. |
rahasia aplikasi | AppSecret akun resmi dapat dilihat di latar belakang akun resmi. |
Parameter opsional | menjelaskan |
---|---|
aktifkanCryptedMode | Apakah akan mengaktifkan mode enkripsi panggilan balik, defaultnya benar. Jika diaktifkan, Anda perlu mengunduh file kebijakan izin tidak terbatas JCE untuk mencakup file yang relevan di jdk. Untuk detailnya, lihat contoh kesalahan umum di WeChat. |
autoUpdateAccessToken | Apakah akan memperbarui access_token secara otomatis ketika terjadi kesalahan terkait access_token. Defaultnya adalah salah. |
accessTokenStrategyClass | Strategi akses access_token, defaultnya adalah space.chensheng.wechatty.common.http.MemoryAccessTokenStrategy, menyimpan access_token di memori, dan aplikasi dapat mengimplementasikan strategi aksesnya sendiri, seperti menyimpannya di database, yang akan diperkenalkan di detailnya nanti. |
kunci pembayaran | Kunci pembayaran WeChat |
payCertFile | Jalur file sertifikat pembayaran WeChat |
kata sandi payCert | Kata sandi sertifikat pembayaran WeChat |
pembayaranMchId | ID pedagang pembayaran WeChat |
membayarClientIp | Hubungi IP mesin untuk pembayaran |
poolingHttpProxyEnable | Apakah akan meminta server WeChat melalui server proxy, defaultnya salah |
poolingHttpProxyHostname | Nama host server proksi, seperti www.chensheng.space |
poolingHttpProxyPort | Pelabuhan server proksi |
poolingHttpProxyNama Pengguna | Nama pengguna server proxy |
poolingHttpProxyPassword | Kata sandi server proksi |
poolingHttpMaxPerRoute | Jumlah maksimum koneksi bersamaan per tautan di kumpulan koneksi http, defaultnya adalah 50 |
poolingHttpMaxTotal | Jumlah maksimum koneksi bersamaan di kumpulan koneksi http, default 200 |
poolingHttpSocketTimeoutMillis | Jumlah milidetik untuk batas waktu soket, default 10.000 |
poolingHttpConnectTimeoutMillis | Jumlah milidetik untuk terhubung ke batas waktu server WeChat, default 10.000 |
poolingHttpConnectionRequestTimeoutMillis | Dapatkan batas waktu koneksi milidetik dari kumpulan koneksi http, default 10.000 |
poolingHttpTcpNoDelay | Apakah akan mengaktifkan tpcNoDelay, defaultnya benar |
mpAppContext.getAccessTokenFetcher().updateAccessToken()
secara rutin, biasanya setiap 1,5 jam sekali, karena waktu kedaluwarsa access_token adalah 2 jam.accessTokenStrategyClass=your.package.name.YourAccessTokenStrategy
di wechat-mp.properties. Berikut strategi untuk mengakses database accesss_token : import space . chensheng . wechatty . common . http . AccessTokenStrategy ;
//因为这个策略类的实例化不是通过Spring来管理的,所以在这个类中不能使用Autowired来注入bean,
//要通过ApplicationContext#getBean方法来获取。
public class DatabaseAccessTokenStrategy implements AccessTokenStrategy {
//将access_token存到数据库中去
@ Override
public void doSave ( String accessToken ) {
TokenService tokenService = ApplicationContextUtil
. getApplicationContext (). getBean ( TokenService . class );
tokenService . doSave ( accessToken );
}
//从数据库中取出access_token
@ Override
public String doQuery () {
TokenService tokenService = ApplicationContextUtil
. getApplicationContext (). getBean ( TokenService . class );
return tokenService . doQuery ();
}
}
Ketika MpAppContext
diinisialisasi, tambahkan pendengar pesan melalui WechatMpBootstrap
untuk menerima pesan (pendengar pesan akan diperkenalkan nanti):
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
bootstrap.addMsgListener(new SubscribeEventListener());
bootstrap.addMsgListener(new UnsubscribeEventListener());
Jika Anda telah menyetel URL panggilan balik di latar belakang akun resmi WeChat, server WeChat akan mengirimkan permintaan GET ke URL ini untuk verifikasi. Berikut ini adalah contoh verifikasi SpringMVC:
@RestController
@RequestMapping(value = "/wechat-mp")
public class CallbackController extends BaseController{
@Autowired
private MpAppContext mpAppContext;
//验证请求,并回复字符串
@RequestMapping(value = "/callback", method = RequestMethod.GET)
public String verify(String msg_signature, String timestamp, String nonce, String echostr) {
String reply = mpAppContext.getCallbackModeVerifier().verify(msg_signature, timestamp, nonce, echostr);
return reply;
}
}
Setelah memverifikasi permintaan panggilan balik, mode panggilan balik sebenarnya diaktifkan. Jika pengguna mengirim pesan ke akun resmi, server WeChat akan mengirimkan permintaan POST ke URL panggilan balik dan meneruskan pesan ke URL ini. Pengembang perlu menangani permintaan ini di aplikasi web (dan Contoh verifikasi sebelumnya mengaktifkan panggilan balik di pengontrol):
@RestController
@RequestMapping(value = "/wechat-mp")
public class CallbackController extends BaseController{
@Autowired
private MpAppContext mpAppContext;
//接收回调消息,并回复相应xml消息
@RequestMapping(value = "/callback", method = RequestMethod.POST)
public String verify(String msg_signature, String timestamp, String nonce) {
//postBody是请求体内容,String格式,开发者可以通过HttpServletRequest来解析
String replyXml = mpAppContext.getMpMessageDispatcher().dispatch(msg_signature(), timestamp, nonce, postBody);
return replyXml;
}
}
Pengembang dapat mendengarkan jenis pesan tertentu dengan mewarisi space.chensheng.wechatty.common.message.MessageListener
. Berikut adalah contoh mendengarkan pesan teks yang dikirim oleh pengguna:
public class TextMessageListener extends MessageListener<TextInboundMessage> {
@Override
protected ReplyMessage onMessage(TextInboundMessage message) {
String content = message.getContent();
//根据消息内容来回复用户
if ("1".equals(content)) {
TextReplyMessage replyMsg = new TextReplyMessage();
replyMsg.setContent("this is reply message content");
replyMsg.setFromUserName(message.getToUserName());
replyMsg.setToUserName(message.getFromUserName());
replyMsg.setCreateTime(System.currentTimeMillis());
return replyMsg;
}
//返回null表示不回复用户
return null;
}
}
informasi | menjelaskan |
---|---|
Pesan Teks Masuk | pesan teks |
Pesan Masuk Gambar | Pesan gambar |
LinkInboundMessage | Lompat ke pesan grafis |
LokasiPesan Masuk | Bagikan informasi lokasi |
Pesan Masuk Video Pendek | Pesan video kecil |
Pesan Masuk Video | pesan video |
Pesan Suara Masuk | pesan suara |
KlikEventMessage | Klik pada pesan menu normal |
LihatPesan Acara | Klik untuk melompat ke pesan menu tautan |
LokasiAcaraPesan | Pesan acara lokasi |
BerlanggananPesan Acara | Pengguna mengikuti berita akun publik |
Berhenti BerlanggananEventMessage | Ingatlah untuk berhenti mengikuti pesan akun publik |
PindaiEventMessage | Pengguna memindai pesan kode QR |
MassSendJobFinishEventMessage | Laporan penyelesaian pengiriman pesan grup |
informasi | menjelaskan |
---|---|
Pesan Balasan Teks | balasan teks |
Pesan Balasan Gambar | Balasan gambar |
Pesan Balasan Musik | balasan musik |
Pesan Balasan Berita | Balasan grafis |
Pesan Balasan Video | balasan video |
Pesan Balasan Suara | Balasan suara |
Akun resmi dapat secara proaktif mengirimkan pesan kepada pengguna, termasuk pesan grup dan pesan layanan pelanggan. Semua pesan dikirim secara seragam menggunakan space.chensheng.wechatty.mp.message.MpMessageSender
.
TextMassMessage message = new TextMassMessage();
message.setIsToAll(true);
message.setContent("群发消息测试");
mpAppContext.getMpMessageSender().send(message, 3);
Jenis pesan grup | menjelaskan |
---|---|
Pesan TeksMass | Teks massal |
Pesan GambarMass | Pengiriman grup gambar |
MpnewsMassMessage | Pengiriman grup gambar dan teks dalam WeChat |
MpvideoMassMessage | Pengiriman grup video |
Pesan SuaraMass | Pengiriman grup suara |
WxcardMassMessage | Distribusi massal kartu dan kupon WeChat |
TextCsMessage message = new TextCsMessage();
message.setToUser("thisIsUserOpenId");
message.setContent("客服消息测试 n 212");
mpAppContext.getMpMessageSender().send(message, 3);
Jenis pesan layanan pelanggan | menjelaskan |
---|---|
Pesan TeksCs | Layanan pelanggan SMS |
Pesan GambarCs | Bayangkan layanan pelanggan |
MpnewsCsMessage | Layanan pelanggan grafis dalam WeChat |
BeritaCsPesan | Layanan pelanggan grafis eksternal |
Pesan VideoCs | Layanan pelanggan video |
Pesan SuaraCs | Layanan pelanggan suara |
Pesan WxcardCs | Layanan Pelanggan Kartu WeChat dan Voucher |
Manajemen material terutama melibatkan pengunggahan, pembuatan kueri, modifikasi, dan penghapusan material. Jenis material mencakup gambar, video, suara, dan grafik.
Pengunggahan materi diselesaikan dengan mengoperasikan kelas pengunggahan materi yang sesuai. Berikut adalah contoh pengunggahan gambar:
File image = new File("/this/is/image/path.jpg");
ImagePermanentMedia material = new ImagePermanentMedia(mpAppContext, image);
UploadResponse resp = material.upload();
Kelas unggah materi | menjelaskan |
---|---|
GambarPermanentMedia | gambar permanen |
JempolPermanentMedia | Gambar kecil permanen |
VideoPermanenMedia | video permanen |
SuaraPermanenMedia | suara permanen |
Berita Permanen | Gambar dan teks permanen |
PermanentNewsImg | Gambar dalam Grafik Permanen |
GambarTemporaryMedia | Gambar sementara |
JempolTemporaryMedia | Gambar mini sementara |
VideoTemporaryMedia | video sementara |
SuaraTemporaryMedia | Suara sementara |
Operasi kueri material diselesaikan melalui kelas alat space.chensheng.wechatty.mp.material.MaterialQuery
dan space.chensheng.wechatty.mp.material.MaterialFinder
.
mpAppContext.getMaterialQuery().count()
mpAppContext.getMaterialQuery().listNews(int offset, int count)
mpAppContext.getMaterialQuery().listMedia(MediaType mediaType, int offset, int count)
mpAppContext.getMaterialFinder().findNews(String mediaId)
mpAppContext.getMaterialFinder().findPermanentVideo(String mediaId)
mpAppContext.getMaterialFinder().findTemporaryVideo(String mediaId)
mpAppContext.getMaterialFinder().downloadPermanentMedia(String mediaId, String saveDir, String fileName)
mpAppContext.getMaterialFinder().downloadTemporaryMedia(String mediaId, String saveDir, String fileName)
Operasi penghapusan material diselesaikan melalui kelas alat space.chensheng.wechatty.mp.material.MaterialDeleter
.
mpAppContext.getMaterialDeleter().delete(String mediaId)
Pembuatan kode QR dengan parameter diselesaikan melalui kelas alat space.chensheng.wechatty.mp.account.QRCodeCreator
.
mpAppContext.getQRCodeCreator().createTemporary(int expireSeconds, int sceneId)
mpAppContext.getQRCodeCreator().createPermanent(int sceneId)
mpAppContext.getQRCodeCreator().createPermanent(String sceneStr)
Meminta informasi pengguna diimplementasikan melalui UserInfoQuery
.
mpAppConext.getUserInfoQuery().get(String openId)
mpAppContext.getUserInfoQuery().batchGet(List<String> openIds)
Otorisasi pengguna diterapkan melalui AuthHelper
.
auth access token
melalui kode tautan otorisasi: mpAppContext.getAuthHelper().fetchAuthAccessToken(String code)
auth access token
: mpAppContext.getAuthHelper().refreshAuthAccessToken(String refreshAccessToken)
auth access token
: mpAppContext.getAuthHelper().fetchAuthUserInfo(String authAccessToken, String openId)
Berikut ini adalah pseudocode untuk otorisasi pengguna:
public WxAuthLoginDto authAndLogin(String code) {
AuthAccessTokenResponse authResp = mpAppContext.getAuthHelper().fetchAuthAccessToken(code);
if (authResp == null || !authResp.isOk()) {
//授权失败,执行相应业务逻辑
return new WxAuthLoginDto("fail");
}
String openId = authResp.getOpenId();
AuthUserInfoResponse wxUserInfo = mpAppContext.getAuthHelper().fetchAuthUserInfo(authResp.getAccessToken(), authResp.getOpenId())
//根据微信用户信息在数据库里查找系统对应的用户,或新建一个用户
//进行登录相关业务逻辑处理
return new WxAuthLoginDto("success");
}
otorisasi jsapi diimplementasikan melalui JsapiHelper
.
jsapi ticket
(Anda dapat menggunakan tugas terjadwal untuk mendapatkan tiket secara teratur dan menyimpannya di database): mpAppContext.getJsapiHelper().fetchTicket()
mpAppContext.getJsapiHelper().generateSignature(String jsapiTicket, String nonceStr, long timestamp, String url)
Saat menginisialisasi MpAppContext
, panggil metode enablePayCert()
dari WechatMpBootstrap
untuk mengaktifkan pembayaran WeChat dan mengonfigurasi parameter terkait. (Lihat modul konfigurasi untuk parameter tertentu)
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.enablePayCert();
mpAppContext.getPayHelper().sendRedPack(RedPackRequest request)
mpAppContext.getPayHelper().sendGroupRedPack(GroupRedPackRequest request)
mpAppContext.getPayHelper().transfers(TransfersRequest request)
mpAppContext.getPayHelper().unifiedOrder(UnifiedOrderRequest request)
mpAppContext.getPayHelper().parsePayNotify(String notifyContent)
mpAppContext.getPayHelper().validatePayNotify(PayNotifyResponse response)
mpAppContext.getPayHelper().orderQuery(OrderQueryRequest request)
mpAppContext.getPayHelper().closeOrder(CloseOrderRequest request)
mpAppContext.getPayHelper().shortUrl(String longUrl)
mpAppContext.getPayHelper().generateJsapiPayParams(String prepayId, PaySignType signType)
mpAppContext.getPayHelper().refund(RefundRequest request)
mpAppContext.getPayHelper().parseRefundNotify(String notifyContent)