开始之前先让博主吐槽下微信的接口文档与接口规则。一个代金券的模块搞了3个星期。严重怀疑微信的产品经理跟项目经理有病。写文档的程序员也是。吐槽结束。
一、准备
- 微信公众号的AppId和密钥Secret
- v3接口的证书号和证书(.pem文件)
- v3Api密钥(用于解析核销通知)
- 耐心和刀!!(可以随时捅死微信的程序员)
ps:如果是商户自己调用api的话(这一步不做的话会报
body={"code":"INVALID_REQUEST","message":"可用商户不符合规则,请检查"})
需要去商家支付平台开启产品--》https://pay.weixin.qq.com/ 在产品中心下--》我的产品--》开通免资金代金券
如果是服务商调用需要进入邀请商户授权,当服务商点击发起授权后,需要商户进入商户平台确认邀请(商户的支付平台在上面消息中心确定授权,不授权的话服务商无法帮商户创建代金券)当商户授权完,商户账号下也需要开启免资金代金券的功能。
二、第三方框架导入
在这里感谢 Javen大佬的 IJPay-WxPay框架
Github地址: https://github.com/Javen205/IJPay
Gitee:http://gitee.com/Javen205/IJPay
<dependency> <groupId>com.github.javen205</groupId> <artifactId>IJPay-WxPay</artifactId> <version>2.6.3</version> </dependency>
本人使用的时候该版本的v3接口还不算太完善,所以我只是使用了这个框架的调用微信v3的请求方法
新的应该已经支持直接调用代金券接口创建了吧。
其他使用到的关键
<!-- 阿里json --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
lombok <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
// 这两个框架可以不加(本人用于测试接口用的,相关配置可以参考对应的文档) <!-- swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
三、上代码
微信的配置文件
import lombok.Data;
/**
* @Description: 微信配置
* @Author: Joshua
* @CreateDate: 2020/7/16 12:39
* @Version 1.0
*/
@Data
public class WxConfig {
public static WxConfig wxConfig;
/**
* 服务商appid
*/
// 服务号
public final static String APPID = "你的AppId";
/**
* secret
*/
public final static String SECRET = "你的密钥";
/**
* v3私钥
*/
public final static String PRIVATE_KEY = "你的私钥";
/**
* v3
* 证书号(会过期) 40个字符
*/
public final static String SERIAL_NO = "证书号";
/**
* 证书路径(我直接放在项目路径下)
*/
public final static String KEY_PATH = "../../apiclient_key.pem";
/**
* v3
* API密钥(自己设置的32字符)
*/
public final static String API_V3_KEY = "v3API密钥";
/**
* 服务商商户号(如果你是服务商,如果是商户着就是商户号)
*/
public final static String MCH_ID = "服务商商户号";
/**
* 微信代金券通知地址(必须是https的)
*/
public final static String COUPON_NOTIFY = "https://...../redirect-anon/wxCouponNotify";
}
请求实体(里面有些字段是我自己需要使用的,其他开发者看着需求更改)
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
/**
* 微信优惠券
*
* @author Joshua
* @since 2020-08-01
*/
@Data
@Entity
@Table(name = "wx_coupon")
@ApiModel(value = "WxCoupon", description = " 微信优惠券")
public class WxCoupon implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主鍵Id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(name = "id", value = "id", example = "1")
private Integer id;
/**
* 商户id
*/
@ApiModelProperty(name = "merchantId", value = "商户id")
private Integer merchantId;
/**
* 子商户号
*/
@ApiModelProperty(name = "belongMerchant", value = "子商户号")
private String belongMerchant;
/**
* 卡券标题
*/
@ApiModelProperty(name = "stockName", value = "卡券标题")
private String stockName;
/**
* 开始时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(name = "beginTimestamp", value = "开始时间")
private