7.3.2 交易服务微信下单
交易服务微信下单是提供给支付入口请求的微信付款的接口,当用户用微信客户端扫描二维码进入确认支付页面, 点击确认支付即将请求此接口。
7.3.2.1 H5页面
按照微信官方例子编写调起微信客户端支付的H5页面,从资料文件夹拷贝“wxpay.html”到交易服务下
7.3.2.2 接口定义
1、接口描述
1)接收前端支付请求
2)保存订单信息到惠民支付平台
3)调用支付渠道代理服务请求微信下单接口
2、接口定义
1、在TransactionServiceImpl中编写submitOrderByWechat接口。
/**
\* 微信确认支付
\* @param payOrderDTO
\* @return 微信下单接口的响应数据
\* @throws BusinessException
*/
Map<String, String> submitOrderByWechat(PayOrderDTO payOrderDTO) throws BusinessException;
2 在PayController中定义接口如下:
@ApiOperation("微信门店下单付款")
@PostMapping("/wxjspay")
public ModelAndView createWXOrderForStore(OrderConfirmVO orderConfirmVO, HttpServletRequest request) {
if (StringUtils.isBlank(orderConfirmVO.getOpenId())) {
throw new BusinessException(CommonErrorCode.E_300002);
}
//应用id
String appId = payOrderDTO.getAppId();
AppDTO app = appService.getAppById(appId);
//商户id
payOrderDTO.setMerchantId(app.getMerchantId());
//客户端ip
payOrderDTO.setClientIp(IPUtil.getIpAddr(request));
//将前端输入的元转成分
payOrderDTO.setTotalAmount(Integer.parseInt(AmountUtil.changeY2F(orderConfirmVO.getTotalAmount().toString())));
//调用微信下单接口
Map<String, String> jsapiResponse = transactionService.submitOrderByWechat(payOrderDTO);
log.info("/wxjspay 微信门店下单接口响应内容:{}",jsapiResponse);
return new ModelAndView("wxpay", jsapiResponse);
}
7.3.2.3 接口实现
本接口实现两部分内容:
1)保存订单到惠民支付数据库
2)调用支付渠道代理服务请求微信下单接口
1、保存订单
实现方法同支付宝下单,需要注意订单信息的支付渠道标识为WX_JSAPI:
/**
\* 微信确认支付
\* @param payOrderDTO
\* @return 微信下单接口的响应数据
\* @throws BusinessException
*/
@Override
public Map<String, String> submitOrderByWechat(PayOrderDTO payOrderDTO) {
//微信openid
String openId = payOrderDTO.getOpenId();
payOrderDTO.setPayChannel("WX_JSAPI");
//保存订单
PayOrderDTO save = save(payOrderDTO);
String tradeNo = save.getTradeNo();
//微信统一下单
return weChatJsapi(openId,tradeNo);
}
2、请求支付渠道代理服务进行微信下单
/**
\* 微信jsapi 调用支付渠道代理
\* @param orderResult 下单请求
\* @return
*/
private Map<String, String> weChatJsapi(String openId,String tradeNo) {
//根据订单号查询订单详情
PayOrderDTO payOrderDTO = queryPayOrder(tradeNo);
if(payOrderDTO == null){
throw new BusinessException(CommonErrorCode.E_400002);
}
//构造微信订单参数实体
WeChatBean weChatBean = new WeChatBean();
weChatBean.setOpenId(openId);//openid
weChatBean.setSpbillCreateIp(payOrderDTO.getClientIp());//客户ip
weChatBean.setTotalFee(payOrderDTO.getTotalAmount());//金额
weChatBean.setBody(payOrderDTO.getBody());//订单描述
weChatBean.setOutTradeNo(payOrderDTO.getTradeNo());//使用聚合平台的订单号 tradeNo
weChatBean.setNotifyUrl("none");//异步接收微信通知支付结果的地址(暂时不用)
//根据应用、服务类型、支付渠道查询支付渠道参数
PayChannelParamDTO payChannelParamDTO =
payChannelService.queryParamByAppPlatformAndPayChannel(payOrderDTO.getAppId(),"**huimin**_c2b", "WX_JSAPI");
if(payChannelParamDTO == null){
throw new BusinessException(CommonErrorCode.E_300007);
}
//支付宝渠道参数
WXConfigParam wxConfigParam = JSON.parseObject(payChannelParamDTO.getParam(), WXConfigParam.class);
return payChannelAgentService.createPayOrderByWeChatJSAPI(wxConfigParam, weChatBean);
}
7.3.2.4 接口测试
1、生成门店c扫b的二维码
2、打开模拟器,使用微信扫码,进入支付确认页面
3、输入金额,点击立即支付
4、观察控制台日志, 终订单写入惠民平台数据库
5、调起微信支付客户端,输入密码支付成功