主要记录微信企业付款开发的过程
开发前准备:1.申请微信appid,2.微信secret,3.微信mchid商户名,4.微信key,5.下载证书,
6.商户平台设置扫码回调接口,即项目的外网可访问地址
微信企业付款官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
商户签名以及证书相关官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3
一、业务单生成,推送消息至虚拟充值服务,采用队列,这一步可以省略,只是项目中需要
/**
* 消费业务单传递过来的消息
* 充值类,快充订单,回传状态至虚拟商品,然后生成转账二维码
*
* @param message
* @author scott
*/
@RabbitListener(queues = VirtualProductQueueConstants.VIRTUAL_RECHARGE_ORDER_QUEUE, containerFactory = "rabbitListenerContainerFactory")
@RabbitHandler
public void getWeChatQrCodeMessage(MessageDto<WeChatQrCodeMessage> message) {
logger.info("RechargeOrderReceiver==>getWeChatQrCodeMessage(), message:{}", JSON.toJSONString(message));
try {
orderRechargeService.addOrderRecharge(message.getMessage().getOrderRecharge());
createOrderRecharge(message.getMessage());
} catch (Exception e) {
logger.error("RechargeOrderReceiver==>getWeChatQrCodeMessage,消费失败", e);
}
}
/**
* 调用微信接口生成二维码,并添加二维码记录
*
* @param weChatQrCodeMessage
* @author scott
*/
private void createOrderRecharge(WeChatQrCodeMessage weChatQrCodeMessage) {
OrderRecharge orderRecharge = weChatQrCodeMessage.getOrderRecharge();
RechargeOrderQrCode qrCode = new RechargeOrderQrCode();
qrCode.setOrderNo(orderRecharge.getOrderNo());
qrCode.setItemNo(orderRecharge.getItemNo());
qrCode.setBuyerId(orderRecharge.getBuyerId());
qrCode.setOrderTime(orderRecharge.getOrderTime());
int count = rechargeOrderQrCodeService.addRechargeOrderQrCode(qrCode);
if (count == 0) {
//当二维码失败且重试次数小于3次时,进行重试,这里用另外一个队列做重试队列并规定重试次数
int retryCount = weChatQrCodeMessage.getRetryCount() != null ? weChatQrCodeMessage.getRetryCount() : 0;
if (retryCount < Constants.WECHAT_RETRY_COUNT) {
//重试次数+1
weChatQrCodeMessage.setRetryCount(weChatQrCodeMessage.getRetryCount() + 1);
mqDao.pushRetryCreateWeChatQrCode(weChatQrCodeMessage);
}
}
}
获取微信token官方文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
生成二维码官方文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542
/**
* 添加充值类订单二维码生成
*
* @param orderQrCode
* @return
* @author scott
*/
@Override
public int addRechargeOrderQrCode(RechargeOrderQrCode orderQrCode) {
int count = 0;
try {
//将token写到缓存中,每次请求的token最长时间为7200秒,缓存的最长时间比过期时间稍短即可
String accessToken = valueOperations.get(Constants.WECHAT_ACCESS_TOKEN_REDIS_KEY);
if (StringUtils.isBlank(accessToken)) {
String accessTokenResultMsg = rfRechargeOrderService.getWeChatAccessToken();
if (StringUtils.isNotBlank(accessTokenResultMsg)) {
String errorCode = JsonUtil.getNodeValueRemoveQuotes(accessTokenResultMsg, "errcode");
if (StringUtils.isNotBlank(errorCode) && !"0".equals(errorCode)) {
logger.error("OrderRechargeServiceImpl==>addOrderRechargeAndC