1.微信付款码支付,相比微信小程序支付和微信Native支付,不用传trade_type,需要多传一个auth_code(付款码code) ,调用微信支付sdk的microPay()方法
2.频繁使用付款码支付的话会让输入密码,输入密码的同时扫码付款不会阻塞住而是会直接返回付款失败,这时候需要重新扫码付款,如果用户扣款成功了,商户会显示付款成功
后端代码
@PostMapping("/scanCodePayOrder")
@ApiOperation("微信扫码支付")
public R scanCodePayOrder(@RequestBody ScanCodePayOrderForm form,@RequestHeader Map<String,Object> header){
ValidatorUtils.validateEntity(form);
String token = header.get("token").toString();
Integer userId = Integer.parseInt(jwtUtils.getClaimByToken(token).getSubject());
LambdaQueryWrapper<UserEntity> uew = new LambdaQueryWrapper<>();
uew.eq(UserEntity::getUserId, userId);
UserEntity user = userService.getOne(uew);
if (user == null) {
return R.error("用户不存在!");
}
LambdaQueryWrapper<Order> oew = new LambdaQueryWrapper<>();
Integer orderId = form.getOrderId();
oew.eq(Order::getId, orderId);
Order order = orderService.getOne(oew);
if (order == null) {
return R.error("该用户没有此订单!");
}
if (!Objects.equals(order.getStatus(), EnumUtil.PAY_STATUS_NO_PAY.getCode())) {
return R.error("该订单已支付!");
}
//判断优惠券是否过期
//判断活动是否过期
//向微信平台发送创建支付订单的请求
try {
//微信支付的单位是分,要转换一下
String amount = String.valueOf(order.getAmount().multiply(BigDecimal.valueOf(100)).intValue());
WXPay wxPay = new WXPay(wxPayConfig);
Map<String, String> paramMap = new HashMap<>();
String nonceStr = WXPayUtil.generateNonceStr();
paramMap.put("nonce_str", nonceStr); //随机字符串
paramMap.put("body", "商品备注信息");
paramMap.put("out_trade_no", order.getCode()); //商品订单流水号,必须为一
paramMap.put("total_fee", amount); //订单金额
paramMap.put("spbill_create_ip", "127.0.0.1");
paramMap.put("auth_code", form.getAuthCode());
String sign = WXPayUtil.generateSignature(paramMap, wxConfiguration.getMchKey());
paramMap.put("sign", sign);
Map<String, String> result = wxPay.microPay(paramMap);
log.info("result:{}",result);
String resultCode = result.get("result_code");
String returnCode = result.get("return_code");
if (!"SUCCESS".equals(resultCode) || !"SUCCESS".equals(returnCode)) {
return R.error("付款失败");
}
//支付订单Id
String prepayId = result.get("transaction_id");
if (StringUtils.isNotBlank(prepayId)) {
order.setPrepayId(prepayId);
order.setStatus(EnumUtil.PAY_STATUS_PAIED.getCode());
order.setPaymentType(EnumUtil.WX.getCode());
orderService.updateById(order);
return R.ok("付款成功");
}else {
log.error("微信支付出现异常,订单号:{}",orderId);
return R.error("微信支付出现异常,订单号:{}" + orderId);
}
} catch (Exception e) {
e.printStackTrace();
log.error("微信支付出现异常,订单号:{}",orderId);
return R.error("微信支付出现异常,订单号:{}" + orderId);
}
}
前端js代码
$(function () {
/* 查询订单详情 */
$.ajax({
url: wxUrl.searchOrderById,
type: 'post',
dataType: 'json',
contentType: 'application/json',
beforeSend: function (request) {
request.setRequestHeader('token', localStorage.getItem('token'));
},
data: JSON.stringify({
orderId: 2,
}),
success(res) {
// console.log(res);
if (res.code == 0) {
let order = res.order;
if (order.status === 1) {
order.status = '未付款';
} else if (order.status == 2) {
order.status = '已付款';
} else if (order.status == 3) {
order.status = '已发货';
} else if (order.status == 4) {
order.status = '已签收';
}
let code = order.code;
let amount = order.amount;
let status = order.status;
let date = order.createTime;
$('#code').text(code);
$('#status').text(status);
$('#amount').text(amount);
$('#pay').text(amount);
$('#date').text(date);
$('.pay-btn').attr('data-order-id', order.id);
if (status == '已付款') {
$('pay-btn').attr('disabled', true);
$('.pay-btn').css({
'background-color': '#666',
});
}
}
},
});
/* 点击付款,使用键盘事件输入付款码的authCode 进行扣款 */
$('.pay-btn').click(function () {
$('.pay-btn').attr('disabled', true);
$('.message').text('扫码中,请不要做其他操作!');
let authCode = '';
//给当前页面绑定键盘事件输入authCode
$(document).bind('keydown', function (event) {
//authCode输入完成之后,点击回车
if (event.keyCode == 13) {
console.log('authCode' + authCode);
let orderId = $('.pay-btn').data('order-id');
$.ajax({
url: wxUrl.scanCodePayOrder,
type: 'post',
dataType: 'json',
contentType: 'application/json',
beforeSend: function (request) {
request.setRequestHeader('token', localStorage.getItem('token'));
},
data: JSON.stringify({
orderId: orderId,
authCode: authCode,
}),
success(res) {
console.log(res);
if (res.msg == '付款成功') {
$(document).unbind('keydown');
$('.message').text('付款成功!');
setTimeout(() => {
location.reload();
}, 1000);
} else {
$('.message').text('付款失败!');
}
},
});
/* 如果让输入密码,则会直接返回支付失败,此时按esc键,重新扫码支付即可,不会重复支付此订单 */
} else if (event.keyCode == 27) {
$(document).unbind('keydown');
$('.message').text('支付设备已经准备好');
$('.pay-btn').removeAttr('disabled');
}
let ch = String.fromCharCode(event.keyCode);
authCode += ch;
});
});
});