项目简介
用计算机六进制从 000000 -111111,即 0到63 来表示易经中的64个卦象,然后根据用户在公众号输入的摇卦数据返回对应的卦象,并实现在线接收用户的打赏。
环境准备
准备好一个域名, 如果没有的话可以用花生壳或者其他工具,网上方法很多,你懂得。
因为微信的服务器会通过你的域名将信息发送到你的应用程序。
订阅号设置
-
基础信息配置;
这里获取 AppId 和 Secret -
服务器配置;
URL: http://域名/接口 比如 https://x1p1.xxx.com/wx/trans, 这里 https 是协议,x1p1.xxx.com 是你的域名,wx/trans 是你应用程序和微信的交互接口,即微信会把签名后的消息发送你程序中这个入口。程序在这里完成消息的验证和路由。
Token: 自己随便写了,确保和程序里面 一致,比如我这里是 tokendabaobei
AES: 用于密文传输使用的加密解密字符串,随机生成即可,和用用程序保持一致。
下面是程序中的配置,我用的是SpringBoot开发server: port: 65000 spring: application: name: itg-wx-client-center thymeleaf: mode: HTML encoding: UTF-8 content-type: text/html cache: false wx: mp: appId: 和公众号一致 secret: 和公众号一致 token: 和公众号一致 aesKey: 和公众号一致
到这里配置已经完成了。
核心代码
核心代码就是接收和响应用户通过微信服务器发过来的消息。即上面的 /wx/trans 。
/**
* 微信消息入口
*/
@RestController
@RequestMapping("/wx/trans")
public class WxMsgTransController {
@Autowired
private WxMpService mpService; // 开源的 开发包
@Autowired
private CoreService coreService; // 消息校验和路由
@Autowired
protected WxMpConfigStorage configStorage; // 持久化
/*
* 微信消息统一入口
*/
@ResponseBody
@PostMapping(produces = "application/xml; charset=UTF-8")
public void post( @RequestParam("signature") String signature,
@RequestParam(name = "encrypt_type", required = false) String encType,
@RequestParam(name = "msg_signature", required = false) String msgSignature,
@RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
// check signature!
if (!mpService.checkSignature(timestamp, nonce, signature)) {
response.getWriter().println("Error, IllegelParameter");
return;
}
// 是否密文
String encryptType = StringUtils.isBlank(encType) ? "raw" : encType;
if ("raw".equals(encryptType)) {
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
// 路由消息到对应的handler
WxMpXmlOutMessage outXml = coreService.route(inMessage);
if (outXml == null) {
response.getWriter().write("");
} else {
response.getWriter().write(outXml.toXml());
}
return;
}
if ("aes".equals(encryptType)) {
WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, mpService.getWxMpConfigStorage(), timestamp, nonce, msgSignature);
WxMpXmlOutMessage outMessage = coreService.route(inMessage);
if (outMessage == null) {
response.getWriter().write("");
} else {
response.getWriter().write(outMessage.toEncryptedXml(configStorage));
}
return;
}
response.getWriter().println("不可识别的加密类型");
}
}
路由代码:
@Override
public void refreshRouter() {
final WxMpMessageRouter newRouter = new WxMpMessageRouter(
this.wxMpService);
// 所有事件的日志
newRouter.rule().handler(this.logHandler).next();
// 关注事件
newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
.event(WxConsts.EventType.SUBSCRIBE).handler(this.subscribeHandler)
.end();
// 取消关注事件
newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
.event(WxConsts.EventType.UNSUBSCRIBE).handler(this.unSubscribeHandler)
.end();
// 默认
newRouter.rule().async(false).handler(this.msgHandler).end();
this.router = newRouter;
}
Handler代码:
/**
* 用户关注公众号Handler
* <p>
*/
@Component
public class SubscribeHandler extends AbstractHandler {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context,
WxMpService wxMpService, WxSessionManager sessionManager) {
// 个人订阅号能操作微信的API很少,权限很少, 不能获取openid,等用户信息
return WxMpXmlOutMessage.TEXT()
.content(StringTable.subscribeMsg)
.fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser())
.build();
}
}
这里就完成了一次信息的交互,后面会提供完成代码。
打赏链接的制作
1 申请微信个人商户,这个很简单,拍几张门面照片就可以申请通过,也很快捷。
2 开通好后会有 生成一个微信收款商业版的 链接 如: https://payapp.wechatpay.cn/qrpay/order/home2?key=idc_CHNDVI_GRYyYjNZIWOy.Ykdd1Z8CA–, 点进去如下图:
在我们的消息中加入上面的连接就可以收款了,呵呵。。。
点击: 点此捐赠 到收款
在线演示
可关注 wenwang64 公众号,进行体验。
源码下载
https://download.csdn.net/download/u010209554/86909531