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、调起微信支付客户端,输入密码支付成功