背景
我们之前做了一个有关抽奖的项目,到了开奖时间之后会自动开奖,这里涉及到了一个问题,当用户参与了抽奖之后前端弹出支付窗口,用户可能不会马上支付一直停留在支付页面,但是我们需要让用户在开奖之前支付或者开奖了之后就不允许用户支付了,这里就需要设置支付的一个失效时间。
比如:设置失效时间为2分钟,在支付窗口弹出来之后的两分钟之内才可以支付,两分钟之后支付的话会提示已经失效。
正文
设置失效时间的功能是微信提供的,你只需要在调起支付接口时,传入相应的参数即可。
当用户点击参与抽奖之后创建订单,然后返回调起支付接口需要的参数给前端,前端弹出支付窗口给用户支付。
话不多说直接贴代码:
/**
* @Author Lucas
* @Email 27555595@qq.com
* @Description //TODO 创建订单
* @Date 2020/8/12 13:26
**/
public Map createOrder(//忽略参数...) {
// 忽略创建订单的代码。。。。。。
// 创建订单成功之后,返回调起支付接口需要的参数给前端。
Map map = wxSpPay(outTradeNo, amount, openId, startTime, endTime);
return map;
}
/**
* @Author Lucas
* @Email 27555595@qq.com
* @Description //TODO 生成调起支付接口需要的参数
* @Date 2020/8/12 13:26
* @Param orderId 支付流水号
* @Param payAmount 支付金额
* @Param openId 用户的openId
* @Param startTime 支付的开始时间
* @Param endTime 支付的失效时间
**/
public Map wxSpPay(String orderId, double payAmount, String openId, String startTime, String endTime) {
// 生成prepay_id
String prepayId = wxPayInitialization(orderId, payAmount, openId, WxRequest.WX_SP_PAY, startTime, endTime);
if (StringUtils.isBlank(prepayId)) {
throw new PayException("签名错误!");
}
Map<String, String> map = new TreeMap<String, String>();
map.put(WxRequest.evokePaymentJSAPI.APPID, wxConfig.getSpAppId());
map.put(WxRequest.evokePaymentJSAPI.TIMESTAMP, IdentityUtil.getTimeStamp());
map.put(WxRequest.evokePaymentJSAPI.NONCESTR, IdentityUtil.uuid());
map.put(WxRequest.evokePaymentJSAPI.PACKAGE, "prepay_id=" + prepayId);
map.put(WxRequest.evokePaymentJSAPI.SIGNTYPE, IdentityUtil.SIGN_TYPE_MD5);
try {
map.put(WxRequest.evokePaymentJSAPI.PAYSIGN, IdentityUtil.createSign(map