微信模板消息通知、微信获取AccessToken
This commit is contained in:
parent
e1c95fb137
commit
c062952ae6
@ -56,7 +56,7 @@ public class WeiXinConstant {
|
|||||||
/**
|
/**
|
||||||
* 获取ACCESS_TOKEN
|
* 获取ACCESS_TOKEN
|
||||||
*/
|
*/
|
||||||
public static final String ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
|
public static final String ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
|
||||||
/**
|
/**
|
||||||
* 登录凭证校验
|
* 登录凭证校验
|
||||||
*/
|
*/
|
||||||
@ -78,6 +78,11 @@ public class WeiXinConstant {
|
|||||||
*/
|
*/
|
||||||
public static final String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=%s";
|
public static final String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=%s";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送模板消息
|
||||||
|
*/
|
||||||
|
public static final String MESSAGE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
|
||||||
|
|
||||||
/*-----------------------------*/
|
/*-----------------------------*/
|
||||||
/* */
|
/* */
|
||||||
/* 支付相关 */
|
/* 支付相关 */
|
||||||
@ -108,6 +113,8 @@ public class WeiXinConstant {
|
|||||||
public static final String REFUNDS_NONCE = "nonce";
|
public static final String REFUNDS_NONCE = "nonce";
|
||||||
public static final String REFUNDS_REFUND_STATUS = "refund_status";
|
public static final String REFUNDS_REFUND_STATUS = "refund_status";
|
||||||
public static final String REFUNDS_ASSOCIATED_DATA = "associated_data";
|
public static final String REFUNDS_ASSOCIATED_DATA = "associated_data";
|
||||||
|
public static final String WECHAT_ERRCODE = "errcode";
|
||||||
|
public static final String WECHAT_ERRMSG = "errmsg";
|
||||||
/**
|
/**
|
||||||
* 退款的token的SCHEMA
|
* 退款的token的SCHEMA
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.ycwl.basic.controller.mobile;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ycwl.basic.annotation.IgnoreToken;
|
||||||
|
import com.ycwl.basic.model.wx.WechatMessageSubscribeForm;
|
||||||
|
import com.ycwl.basic.service.mobile.WxNotifyService;
|
||||||
|
import com.ycwl.basic.utils.ApiResponse;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: songmingsong
|
||||||
|
* @CreateTime: 2024-12-06
|
||||||
|
* @Description: 微信消息模板通知
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/mobile/wx/notify/v1")
|
||||||
|
@Api(tags = "微信消息模板通知")
|
||||||
|
public class AppWxNotifyController {
|
||||||
|
@Autowired
|
||||||
|
private WxNotifyService wxNotifyService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "通知", notes = "通知")
|
||||||
|
@PostMapping("/pushMessage")
|
||||||
|
@IgnoreToken
|
||||||
|
public ApiResponse<?> pushMessage(@RequestBody WechatMessageSubscribeForm req) {
|
||||||
|
JSONObject resJson = wxNotifyService.pushMessage(req);
|
||||||
|
return ApiResponse.success(resJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,8 +3,8 @@ package com.ycwl.basic.controller.mobile;
|
|||||||
|
|
||||||
import com.ycwl.basic.annotation.IgnoreToken;
|
import com.ycwl.basic.annotation.IgnoreToken;
|
||||||
import com.ycwl.basic.enums.BizCodeEnum;
|
import com.ycwl.basic.enums.BizCodeEnum;
|
||||||
import com.ycwl.basic.model.wxPay.WXPayOrderReqVO;
|
import com.ycwl.basic.model.wx.WXPayOrderReqVO;
|
||||||
import com.ycwl.basic.model.wxPay.WxPayRespVO;
|
import com.ycwl.basic.model.wx.WxPayRespVO;
|
||||||
import com.ycwl.basic.service.mobile.WxPayService;
|
import com.ycwl.basic.service.mobile.WxPayService;
|
||||||
import com.ycwl.basic.utils.ApiResponse;
|
import com.ycwl.basic.utils.ApiResponse;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@ -26,7 +26,7 @@ import java.security.GeneralSecurityException;
|
|||||||
* @Version: 1.0
|
* @Version: 1.0
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/mobile/wx/v1")
|
@RequestMapping("/api/mobile/wx/pay/v1")
|
||||||
@Api(tags = "微信支付相关接口")
|
@Api(tags = "微信支付相关接口")
|
||||||
public class AppWxPayController {
|
public class AppWxPayController {
|
||||||
|
|
||||||
|
@ -418,13 +418,14 @@ public enum BizCodeEnum {
|
|||||||
|
|
||||||
/* -------------------------------------*/
|
/* -------------------------------------*/
|
||||||
/* */
|
/* */
|
||||||
/* 2000-2019 微信支付相关业务码 */
|
/* 2000-2019 微信相关业务码 */
|
||||||
/* */
|
/* */
|
||||||
/* -------------------------------------*/
|
/* -------------------------------------*/
|
||||||
ADVANCE_PAYMENT_FAILED(2001, "预支付失败"),
|
ADVANCE_PAYMENT_FAILED(2001, "预支付失败"),
|
||||||
ADVANCE_PAYMENT_CALLBACK_FAILED(2002, "预支付回调失败"),
|
ADVANCE_PAYMENT_CALLBACK_FAILED(2002, "预支付回调失败"),
|
||||||
ADVANCE_PAYMENT_REFUND_FAILED(2003, "退款失败"),
|
ADVANCE_PAYMENT_REFUND_FAILED(2003, "退款失败"),
|
||||||
ADVANCE_PAYMENT_CALLBACK_REFUND_FAILED(2004, "退款回调失败"),
|
ADVANCE_PAYMENT_CALLBACK_REFUND_FAILED(2004, "退款回调失败"),
|
||||||
|
REQUEST_WECHAT_FAIL(2005, "请求微信服务器发生异常"),
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.ycwl.basic.model.wxPay;
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信获取token对象
|
||||||
|
* @author: chenxi
|
||||||
|
* @date: 2021/8/5 20:50
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class WechatAccessTokenVO extends WechatBaseVO{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信access_token,由于微信接口返回数据,此处无法保证驼峰命名
|
||||||
|
*/
|
||||||
|
private String access_token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 过期时间,单位秒
|
||||||
|
*/
|
||||||
|
private Integer expires_in;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
39
src/main/java/com/ycwl/basic/model/wx/WechatBaseVO.java
Normal file
39
src/main/java/com/ycwl/basic/model/wx/WechatBaseVO.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: chenxi
|
||||||
|
* @date: 2021/8/5 21:06
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class WechatBaseVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信成功返回码
|
||||||
|
*/
|
||||||
|
public static final Integer SUCCESS_CODE = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误码,0表示正确
|
||||||
|
*/
|
||||||
|
private Integer errcode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
private String errmsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断当前响应是否正常
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isSuccess(){
|
||||||
|
if (errcode == null || errcode.equals(SUCCESS_CODE)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: songmingsong
|
||||||
|
* @CreateTime: 2024-12-06
|
||||||
|
* @Description: 发送消息所需要的参数
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class WechatMessageSubscribeForm {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户的openID
|
||||||
|
*/
|
||||||
|
private String openId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认跳到小程序首页
|
||||||
|
*/
|
||||||
|
private String page = "pages/index/index";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推送文字
|
||||||
|
*/
|
||||||
|
private Map<String, WechatTemplateData> data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跳转小程序的类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
|
||||||
|
*/
|
||||||
|
private String miniprogram_state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 进入小程序查看的语言类型:支持zh_CN、en_US、zh_HK、zh_TW,默认为zh_CN
|
||||||
|
*/
|
||||||
|
private String lang;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
45
src/main/java/com/ycwl/basic/model/wx/WechatMssVO.java
Normal file
45
src/main/java/com/ycwl/basic/model/wx/WechatMssVO.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: songmingsong
|
||||||
|
* @CreateTime: 2024-12-06
|
||||||
|
* @Description: 消息通知请求参数
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class WechatMssVO {
|
||||||
|
/**
|
||||||
|
* 用户openid
|
||||||
|
*/
|
||||||
|
private String touser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订阅消息模版id
|
||||||
|
*/
|
||||||
|
private String template_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认跳到小程序首页
|
||||||
|
*/
|
||||||
|
private String page = "pages/index/index";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推送文字
|
||||||
|
*/
|
||||||
|
private Map<String, WechatTemplateData> data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跳转小程序的类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
|
||||||
|
*/
|
||||||
|
private String miniprogram_state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 进入小程序查看的语言类型:支持zh_CN、en_US、zh_HK、zh_TW,默认为zh_CN
|
||||||
|
*/
|
||||||
|
private String lang;
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: songmingsong
|
||||||
|
* @CreateTime: 2024-12-06
|
||||||
|
* @Description: 消息内容
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class WechatTemplateData {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息通知的内容
|
||||||
|
*/
|
||||||
|
private String value;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.ycwl.basic.model.wxPay;
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
@ -1,4 +1,4 @@
|
|||||||
package com.ycwl.basic.model.wxPay;
|
package com.ycwl.basic.model.wx;
|
||||||
|
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
@ -0,0 +1,123 @@
|
|||||||
|
package com.ycwl.basic.service.impl.mobile;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ycwl.basic.config.WechatConfig;
|
||||||
|
import com.ycwl.basic.constant.NumberConstant;
|
||||||
|
import com.ycwl.basic.constant.WeiXinConstant;
|
||||||
|
import com.ycwl.basic.enums.BizCodeEnum;
|
||||||
|
import com.ycwl.basic.exception.AppException;
|
||||||
|
import com.ycwl.basic.model.wx.WechatAccessTokenVO;
|
||||||
|
import com.ycwl.basic.model.wx.WechatMessageSubscribeForm;
|
||||||
|
import com.ycwl.basic.model.wx.WechatMssVO;
|
||||||
|
import com.ycwl.basic.service.mobile.WxNotifyService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static com.ycwl.basic.constant.WeiXinConstant.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: songmingsong
|
||||||
|
* @CreateTime: 2024-12-06
|
||||||
|
* @Description: 微信消息通知实现
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class WxNotifyServiceImpl implements WxNotifyService {
|
||||||
|
|
||||||
|
private final RestTemplate restTemplate = new RestTemplate();
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WechatConfig wechatConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存accessToken
|
||||||
|
*/
|
||||||
|
private Map<String, AccessTokenCacheEntity> cacheAccessTokenMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccessToken() {
|
||||||
|
String cacheKey = wechatConfig.getMiniProgramAppId() + wechatConfig.getMiniProgramSecret();
|
||||||
|
AccessTokenCacheEntity accessTokenCacheEntity = cacheAccessTokenMap.get(cacheKey);
|
||||||
|
if (accessTokenCacheEntity != null && accessTokenCacheEntity.expireDate.getTime() > System.currentTimeMillis()) {
|
||||||
|
return accessTokenCacheEntity.accessToken;
|
||||||
|
}
|
||||||
|
String url = String.format(WeiXinConstant.ACCESS_TOKEN_WITH_PARAM, wechatConfig.getMiniProgramAppId(), wechatConfig.getMiniProgramSecret());
|
||||||
|
ResponseEntity<WechatAccessTokenVO> responseEntity = restTemplate.getForEntity(url, WechatAccessTokenVO.class);
|
||||||
|
if (HttpStatus.OK == responseEntity.getStatusCode()) {
|
||||||
|
WechatAccessTokenVO accessTokenVO = responseEntity.getBody();
|
||||||
|
if (accessTokenVO.isSuccess()) {
|
||||||
|
accessTokenCacheEntity = new AccessTokenCacheEntity();
|
||||||
|
accessTokenCacheEntity.accessToken = accessTokenVO.getAccess_token();
|
||||||
|
// 设置过期时间,减100秒防止网络延迟失效
|
||||||
|
accessTokenCacheEntity.expireDate = new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(accessTokenVO.getExpires_in() - NumberConstant.HUNDRED));
|
||||||
|
// 缓存一份,有效期内避免重复请求
|
||||||
|
cacheAccessTokenMap.put(cacheKey, accessTokenCacheEntity);
|
||||||
|
return accessTokenVO.getAccess_token();
|
||||||
|
} else {
|
||||||
|
log.error("[微信token]请求AccessToken出现异常,错误信息为{}:{}", accessTokenVO.getErrcode(), accessTokenVO.getErrmsg());
|
||||||
|
throw new AppException(BizCodeEnum.REQUEST_WECHAT_FAIL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new AppException(BizCodeEnum.REQUEST_WECHAT_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给用户发送通知
|
||||||
|
*
|
||||||
|
* @param info
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONObject pushMessage(WechatMessageSubscribeForm info) {
|
||||||
|
RestTemplate restTemplate = new RestTemplate();
|
||||||
|
String url = MESSAGE_SEND_URL + getAccessToken();
|
||||||
|
|
||||||
|
// 拼接推送的模板
|
||||||
|
WechatMssVO wxMssVO = new WechatMssVO();
|
||||||
|
wxMssVO.setTouser(info.getOpenId()); // 用户的openId
|
||||||
|
wxMssVO.setTemplate_id(wechatConfig.getTemplateId()); // 订阅消息模板id
|
||||||
|
wxMssVO.setLang(info.getLang()); // 语言类型
|
||||||
|
wxMssVO.setMiniprogram_state(info.getMiniprogram_state()); // 跳转小程序类型
|
||||||
|
wxMssVO.setPage(info.getPage());
|
||||||
|
|
||||||
|
// // TODO: 推送的内容
|
||||||
|
// Map<String, WechatTemplateData> map = new HashMap<>();
|
||||||
|
// map.put("msg", new WechatTemplateData("发消息了"));
|
||||||
|
wxMssVO.setData(info.getData());
|
||||||
|
|
||||||
|
// 发送
|
||||||
|
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVO, String.class);
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getBody()));
|
||||||
|
Integer errcode = jsonObject.getInteger(WECHAT_ERRCODE);
|
||||||
|
String errmsg = jsonObject.getString(WECHAT_ERRMSG);
|
||||||
|
if (errcode != NumberConstant.ZERO) {
|
||||||
|
throw new AppException(errcode, errmsg);
|
||||||
|
}
|
||||||
|
return JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getBody()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class AccessTokenCacheEntity {
|
||||||
|
/**
|
||||||
|
* token
|
||||||
|
*/
|
||||||
|
private String accessToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 有效期到
|
||||||
|
*/
|
||||||
|
private Date expireDate;
|
||||||
|
}
|
||||||
|
}
|
@ -23,9 +23,9 @@ import com.ycwl.basic.enums.BizCodeEnum;
|
|||||||
import com.ycwl.basic.enums.OrderStateEnum;
|
import com.ycwl.basic.enums.OrderStateEnum;
|
||||||
import com.ycwl.basic.exception.AppException;
|
import com.ycwl.basic.exception.AppException;
|
||||||
import com.ycwl.basic.model.pc.order.resp.OrderRespVO;
|
import com.ycwl.basic.model.pc.order.resp.OrderRespVO;
|
||||||
import com.ycwl.basic.model.wxPay.WXPayOrderReqVO;
|
import com.ycwl.basic.model.wx.WXPayOrderReqVO;
|
||||||
import com.ycwl.basic.model.wxPay.WxPayRespVO;
|
import com.ycwl.basic.model.wx.WxPayRespVO;
|
||||||
import com.ycwl.basic.model.wxPay.WxchatCallbackSuccessData;
|
import com.ycwl.basic.model.wx.WxchatCallbackSuccessData;
|
||||||
import com.ycwl.basic.service.HttpService;
|
import com.ycwl.basic.service.HttpService;
|
||||||
import com.ycwl.basic.service.mobile.WxPayService;
|
import com.ycwl.basic.service.mobile.WxPayService;
|
||||||
import com.ycwl.basic.service.pc.OrderService;
|
import com.ycwl.basic.service.pc.OrderService;
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.ycwl.basic.service.mobile;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ycwl.basic.model.wx.WechatMessageSubscribeForm;
|
||||||
|
|
||||||
|
public interface WxNotifyService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取微信token
|
||||||
|
*/
|
||||||
|
String getAccessToken();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送模板消息
|
||||||
|
*/
|
||||||
|
JSONObject pushMessage(WechatMessageSubscribeForm info);
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package com.ycwl.basic.service.mobile;
|
package com.ycwl.basic.service.mobile;
|
||||||
|
|
||||||
import com.ycwl.basic.model.wxPay.WXPayOrderReqVO;
|
import com.ycwl.basic.model.wx.WXPayOrderReqVO;
|
||||||
import com.ycwl.basic.model.wxPay.WxPayRespVO;
|
import com.ycwl.basic.model.wx.WxPayRespVO;
|
||||||
import com.ycwl.basic.model.wxPay.WxchatCallbackSuccessData;
|
import com.ycwl.basic.model.wx.WxchatCallbackSuccessData;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user