Wechattty Project เป็นเฟรมเวิร์กการพัฒนาที่ใช้ JAVA สำหรับบัญชีสาธารณะ WeChat (รวมถึงบัญชีบริการและบัญชีสมัครสมาชิก) และบัญชีองค์กร WeChat ที่ห่อหุ้มอย่างดีช่วยให้นักพัฒนามุ่งเน้นไปที่การพัฒนาตรรกะทางธุรกิจและปรับปรุงประสิทธิภาพการพัฒนา
Maven ถูกใช้ที่นี่เพื่อแนะนำการพึ่งพา
<dependency>
<groupId>space.chensheng.wechatty</groupId>
<artifactId>wechatty-mp</artifactId>
<version>2.0.0</version>
</dependency>
MpAppContext
คือทางเข้าการโทรแบบรวมของ API บัญชีสาธารณะ ซึ่งเริ่มต้นโดยใช้ WechatMpBootstrap
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
MpAppContext mpAppContext = bootstrap.build();
หากโปรเจ็กต์ได้รับการจัดการโดยใช้สปริง FactoryBean
ก็สามารถนำมาใช้เพื่อเริ่มต้น MpAppContext
สำหรับการอ้างอิงในภายหลัง
@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;
}
}
มีวิธีการกำหนดค่าสองวิธี วิธีแรกคือ配置文件
และอีกวิธีคือ JAVA代码配置
ลำดับความสำคัญของ JAVA代码配置
นั้นสูงกว่าลำดับความสำคัญ配置文件
สร้างไฟล์คอนฟิกูเรชันใหม่ wechat-mp.properties และวางไฟล์ในพาธคลาสโปรเจ็กต์ ตัวอย่างเช่น ในโปรเจ็กต์ Maven ไฟล์นี้สามารถวางในไดเร็กทอรี src/main/resources
การกำหนดค่าทั่วไปมีดังนี้:
token=thisIsToken
aesKey=thisIsAesKey
appId=thisIsYourAppId
appSecret=thisIsAppSecret
เมื่อเตรียมใช้งาน MpAppConetxt
ให้เรียกใช้เมธอด customizeWechatContext
ของ WechatMpBootstrap
เพื่อกำหนดค่า
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");
}
});
พารามิเตอร์ที่จำเป็น | แสดงให้เห็น |
---|---|
โทเค็น | โทเค็นของบัญชีอย่างเป็นทางการสามารถดูได้ในพื้นหลังของบัญชีอย่างเป็นทางการ |
aesKey | คีย์ที่ใช้สำหรับการเข้ารหัสสามารถดูได้ในแบ็กเอนด์ของบัญชีอย่างเป็นทางการ |
รหัสแอป | สามารถดู appId ของบัญชีอย่างเป็นทางการได้ในเบื้องหลังของบัญชีอย่างเป็นทางการ |
ความลับของแอป | สามารถดู appSecret ของบัญชีอย่างเป็นทางการได้ในพื้นหลังของบัญชีอย่างเป็นทางการ |
พารามิเตอร์ทางเลือก | แสดงให้เห็น |
---|---|
เปิดใช้งานCryptedMode | ไม่ว่าจะเปิดใช้งานโหมดการเข้ารหัสการโทรกลับหรือไม่ ค่าเริ่มต้นเป็นจริง หากเปิดอยู่ คุณจะต้องดาวน์โหลดไฟล์นโยบายการอนุญาตแบบไม่จำกัดของ JCE เพื่อให้ครอบคลุมไฟล์ที่เกี่ยวข้องใน jdk สำหรับรายละเอียด โปรดดูตัวอย่างข้อผิดพลาดทั่วไปใน WeChat |
autoUpdateAccessToken | ว่าจะอัปเดต access_token โดยอัตโนมัติเมื่อมีข้อผิดพลาดที่เกี่ยวข้องกับ access_token หรือไม่ ค่าเริ่มต้นคือเท็จ แอปพลิเคชันสามารถอัปเดตผ่านงานที่กำหนดเวลาไว้ได้ ซึ่งจะแนะนำโดยละเอียดในภายหลัง |
เข้าถึงTokenStrategyClass | กลยุทธ์การเข้าถึง access_token ค่าเริ่มต้นคือ space.chensheng.wechatty.common.http.MemoryAccessTokenStrategy จัดเก็บ access_token ไว้ในหน่วยความจำ และแอปพลิเคชันสามารถใช้กลยุทธ์การเข้าถึงของตัวเองได้ เช่น เก็บไว้ในฐานข้อมูล ซึ่งจะถูกนำมาใช้ใน รายละเอียดในภายหลัง |
payKey | รหัสการชำระเงิน WeChat |
payCertFile | เส้นทางไฟล์ใบรับรองการชำระเงิน WeChat |
payCertรหัสผ่าน | รหัสผ่านใบรับรองการชำระเงิน WeChat |
payMchId | รหัสผู้ขายการชำระเงิน WeChat |
payClientIp | โทร IP เครื่องเพื่อชำระเงิน |
รวม HttpProxyEnable | ไม่ว่าจะร้องขอเซิร์ฟเวอร์ WeChat ผ่านพร็อกซีเซิร์ฟเวอร์หรือไม่ ค่าเริ่มต้นจะเป็นเท็จ |
รวม HttpProxyHostname | ชื่อโฮสต์ของพร็อกซีเซิร์ฟเวอร์ เช่น www.chensheng.space |
การรวม HttpProxyPort | พอร์ตพร็อกซีเซิร์ฟเวอร์ |
รวม HttpProxyUsername | ชื่อผู้ใช้พร็อกซีเซิร์ฟเวอร์ |
รวม HttpProxyPassword | รหัสผ่านพร็อกซีเซิร์ฟเวอร์ |
รวม HttpMaxPerRoute | จำนวนการเชื่อมต่อพร้อมกันสูงสุดต่อลิงก์ในกลุ่มการเชื่อมต่อ http ค่าเริ่มต้นคือ 50 |
รวม HttpMaxTotal | จำนวนการเชื่อมต่อพร้อมกันสูงสุดในกลุ่มการเชื่อมต่อ http ค่าเริ่มต้นคือ 200 |
รวม HttpSocketTimeoutMillis | จำนวนมิลลิวินาทีสำหรับการหมดเวลาของซ็อกเก็ต ค่าเริ่มต้นคือ 10000 |
รวม HttpConnectTimeoutMillis | จำนวนมิลลิวินาทีในการเชื่อมต่อกับการหมดเวลาเซิร์ฟเวอร์ WeChat ค่าเริ่มต้นคือ 10,000 |
การรวม HttpConnectionRequestTimeoutMillis | รับการหมดเวลาการเชื่อมต่อเป็นมิลลิวินาทีจากพูลการเชื่อมต่อ http ค่าเริ่มต้นคือ 10,000 |
รวม HttpTcpNoDelay | ไม่ว่าจะเปิดใช้งาน tpcNoDelay หรือไม่ ค่าเริ่มต้นเป็นจริง |
mpAppContext.getAccessTokenFetcher().updateAccessToken()
เป็นประจำ โดยปกติหนึ่งครั้งทุกๆ 1.5 ชั่วโมง เนื่องจากเวลาหมดอายุของ access_token คือ 2 ชั่วโมงaccessTokenStrategyClass=your.package.name.YourAccessTokenStrategy
ใน wechat-mp.properties ต่อไปนี้เป็นกลยุทธ์ในการเข้าถึงฐานข้อมูล 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 ();
}
}
เมื่อเตรียมใช้งาน MpAppContext
ให้เพิ่มตัวฟังข้อความผ่าน WechatMpBootstrap
เพื่อรับข้อความ (ตัวฟังข้อความจะถูกนำมาใช้ในภายหลัง):
WechatMpBootstrap bootstrap = new WechatMpBootstrap();
bootstrap.addMsgListener(new TextMessageListener());
bootstrap.addMsgListener(new SubscribeEventListener());
bootstrap.addMsgListener(new UnsubscribeEventListener());
หากคุณได้ตั้งค่า URL โทรกลับในพื้นหลังของบัญชีอย่างเป็นทางการของ WeChat เซิร์ฟเวอร์ WeChat จะส่งคำขอ GET ไปยัง URL นี้เพื่อตรวจสอบความถูกต้อง ต่อไปนี้เป็นตัวอย่างการตรวจสอบ 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;
}
}
หลังจากตรวจสอบคำขอโทรกลับแล้ว โหมดการโทรกลับจะถูกเปิดใช้งานจริง หากผู้ใช้ส่งข้อความไปยังบัญชีอย่างเป็นทางการ เซิร์ฟเวอร์ WeChat จะส่งคำขอ POST ไปยัง URL โทรกลับและส่งต่อข้อความไปยัง URL นี้ นักพัฒนาจำเป็นต้องจัดการคำขอนี้ในเว็บแอปพลิเคชัน ต่อไปนี้เป็นตัวอย่างของ SpringMVC (และการตรวจสอบก่อนหน้านี้ ตัวอย่างการเปิดใช้งานการโทรกลับในคอนโทรลเลอร์):
@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;
}
}
นักพัฒนาสามารถฟังข้อความบางประเภทได้โดยการสืบทอด space.chensheng.wechatty.common.message.MessageListener
นี่คือตัวอย่างการฟังข้อความที่ผู้ใช้ส่ง:
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;
}
}
ข้อมูล | แสดงให้เห็น |
---|---|
ข้อความข้อความขาเข้า | ข้อความ |
รูปภาพข้อความขาเข้า | ข้อความรูปภาพ |
ลิงค์ข้อความขาเข้า | ข้ามไปที่ข้อความกราฟิก |
ตำแหน่งข้อความขาเข้า | แบ่งปันข้อมูลตำแหน่ง |
ข้อความวิดีโอขาเข้าสั้น | ข้อความวิดีโอขนาดเล็ก |
วิดีโอข้อความขาเข้า | ข้อความวิดีโอ |
ข้อความเสียงขาเข้า | ข้อความเสียง |
คลิกข้อความเหตุการณ์ | คลิกที่ข้อความเมนูปกติ |
ดูข้อความกิจกรรม | คลิกเพื่อข้ามไปยังข้อความเมนูลิงก์ |
ข้อความสถานที่เหตุการณ์ | ข้อความเหตุการณ์สถานที่ |
สมัครสมาชิกEventMessage | ผู้ใช้ติดตามข่าวบัญชีสาธารณะ |
UnsubscribeEventMessage | อย่าลืมเลิกติดตามข้อความบัญชีสาธารณะ |
สแกนข้อความเหตุการณ์ | ผู้ใช้สแกนข้อความรหัส QR |
MassSendJobFinishEventMessage | รายงานการส่งข้อความกลุ่มเสร็จสิ้น |
ข้อมูล | แสดงให้เห็น |
---|---|
ข้อความตอบกลับข้อความ | ตอบกลับข้อความ |
รูปภาพตอบกลับข้อความ | คำตอบรูปภาพ |
ดนตรีตอบกลับข้อความ | เพลงตอบกลับ |
ข่าว ตอบกลับ ข้อความ | การตอบกลับแบบกราฟิก |
วิดีโอตอบกลับข้อความ | วิดีโอตอบกลับ |
ข้อความตอบกลับด้วยเสียง | ตอบกลับด้วยเสียง |
บัญชีทางการสามารถส่งข้อความถึงผู้ใช้ได้ในเชิงรุก รวมถึงข้อความกลุ่มและข้อความบริการลูกค้า ข้อความทั้งหมดจะถูกส่งอย่างสม่ำเสมอโดยใช้ space.chensheng.wechatty.mp.message.MpMessageSender
TextMassMessage message = new TextMassMessage();
message.setIsToAll(true);
message.setContent("群发消息测试");
mpAppContext.getMpMessageSender().send(message, 3);
ประเภทข้อความกลุ่ม | แสดงให้เห็น |
---|---|
ข้อความMassMessage | ข้อความจำนวนมาก |
ImageMassข้อความ | กลุ่มรูปภาพที่ส่ง |
MpnewsMassMessage | การส่งรูปภาพและข้อความเป็นกลุ่มภายใน WeChat |
MpvideoMassMessage | การส่งกลุ่มวิดีโอ |
วอยซ์แมสข้อความ | การส่งกลุ่มเสียง |
WxcardMassMessage | บัตร WeChat และการกระจายคูปองจำนวนมาก |
TextCsMessage message = new TextCsMessage();
message.setToUser("thisIsUserOpenId");
message.setContent("客服消息测试 n 212");
mpAppContext.getMpMessageSender().send(message, 3);
ประเภทข้อความบริการลูกค้า | แสดงให้เห็น |
---|---|
ข้อความCsMessage | ส่งข้อความบริการลูกค้า |
ImageCsข้อความ | รูปภาพการบริการลูกค้า |
MpnewsCsMessage | การบริการลูกค้าแบบกราฟิกภายใน WeChat |
ข่าวCsข้อความ | การบริการลูกค้ากราฟิกภายนอก |
VideoCsข้อความ | การบริการลูกค้าวิดีโอ |
VoiceCsข้อความ | การบริการลูกค้าด้วยเสียง |
WxcardCsข้อความ | บัตร WeChat และบริการลูกค้าบัตรกำนัล |
การจัดการวัสดุส่วนใหญ่เกี่ยวข้องกับการอัปโหลด การสืบค้น การแก้ไข และการลบสื่อ ประเภทวัสดุ ได้แก่ รูปภาพ วิดีโอ เสียง และกราฟิก
การอัปโหลดวัสดุจะเสร็จสิ้นโดยการดำเนินการคลาสการอัปโหลดวัสดุที่เกี่ยวข้อง ต่อไปนี้คือตัวอย่างการอัปโหลดรูปภาพ:
File image = new File("/this/is/image/path.jpg");
ImagePermanentMedia material = new ImagePermanentMedia(mpAppContext, image);
UploadResponse resp = material.upload();
คลาสการอัพโหลดวัสดุ | แสดงให้เห็น |
---|---|
รูปภาพสื่อถาวร | ภาพถาวร |
นิ้วหัวแม่มือสื่อถาวร | ภาพขนาดย่อถาวร |
วีดีโอPermanentMedia | วิดีโอถาวร |
เสียงสื่อถาวร | เสียงถาวร |
ข่าวถาวร | รูปภาพและข้อความถาวร |
ถาวรข่าวรูปภาพ | รูปภาพในกราฟิกถาวร |
รูปภาพสื่อชั่วคราว | ภาพชั่วคราว |
ThumbTemporaryMedia | ภาพขนาดย่อชั่วคราว |
วิดีโอสื่อชั่วคราว | วิดีโอชั่วคราว |
วอยซ์เทมโพรารีมีเดีย | เสียงชั่วคราว |
การดำเนินการสืบค้นวัสดุเสร็จสมบูรณ์ผ่านคลาสเครื่องมือ space.chensheng.wechatty.mp.material.MaterialQuery
และ 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)
การดำเนินการลบวัสดุเสร็จสมบูรณ์ผ่านคลาสเครื่องมือ space.chensheng.wechatty.mp.material.MaterialDeleter
mpAppContext.getMaterialDeleter().delete(String mediaId)
การสร้างโค้ด QR พร้อมพารามิเตอร์จะเสร็จสมบูรณ์ผ่านคลาสเครื่องมือ space.chensheng.wechatty.mp.account.QRCodeCreator
mpAppContext.getQRCodeCreator().createTemporary(int expireSeconds, int sceneId)
mpAppContext.getQRCodeCreator().createPermanent(int sceneId)
mpAppContext.getQRCodeCreator().createPermanent(String sceneStr)
การสืบค้นข้อมูลผู้ใช้จะดำเนินการผ่าน UserInfoQuery
mpAppConext.getUserInfoQuery().get(String openId)
mpAppContext.getUserInfoQuery().batchGet(List<String> openIds)
การอนุญาตผู้ใช้จะดำเนินการผ่าน AuthHelper
auth access token
ผ่านรหัสลิงก์การให้สิทธิ์: mpAppContext.getAuthHelper().fetchAuthAccessToken(String code)
auth access token
: mpAppContext.getAuthHelper().refreshAuthAccessToken(String refreshAccessToken)
auth access token
: mpAppContext.getAuthHelper().fetchAuthUserInfo(String authAccessToken, String openId)
ต่อไปนี้เป็นรหัสเทียมสำหรับการอนุญาตผู้ใช้:
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");
}
การอนุญาต jsapi ดำเนินการผ่าน JsapiHelper
jsapi ticket
(คุณสามารถใช้งานที่กำหนดเวลาไว้เพื่อรับตั๋วเป็นประจำและเก็บไว้ในฐานข้อมูล): mpAppContext.getJsapiHelper().fetchTicket()
mpAppContext.getJsapiHelper().generateSignature(String jsapiTicket, String nonceStr, long timestamp, String url)
เมื่อเริ่มต้น MpAppContext
ให้เรียกใช้เมธอด enablePayCert()
ของ WechatMpBootstrap
เพื่อเปิดใช้งานการชำระเงิน WeChat และกำหนดค่าพารามิเตอร์ที่เกี่ยวข้อง (ดูโมดูลการกำหนดค่าสำหรับพารามิเตอร์เฉพาะ)
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)