微信原生支付异步通知处理订单示例

/**
 * 微信支付结果通知
 */
@Component
@RequestMapping("/地址1/")
public class WechatPayNativeResultAction {

    protected transient Logger logger = Logger.getLogger(this.getClass().getName());

    @Autowired
    private IWechatTradeFlowService wechatTradeFlowService;
    @Autowired
    private PayMedicalCardBusiInfoService payMedicalCardBusiInfoService;


    @Autowired
    private IWXPaySdkService wxPaySdkService;

    /**
     * 处理支付通知
     *
     * @return
     * @throws UnsupportedEncodingException
     */
    @RequestMapping(value = "/地址2/地址3.jhtml", method = RequestMethod.POST)
    @ResponseBody
    public String payResult(HttpServletRequest request, @PathVariable String accountId) throws UnsupportedEncodingException {
        StringBuffer body = null;
        try {
            body = new StringBuffer();
            BufferedReader reader = request.getReader();
            String line = null;
            while ((line = reader.readLine()) != null) {
                body.append(line);
            }


            System.out.println(" *** 接收的通知  >>> message : " + body);
            if (!body.equals("")) {
                Map<String, String> resultMap = WXPayUtil.xmlToMap(body.toString());
                WechatConfigNative aNative = WechatConfig.WECHAT_NATIVE_PAY_CONFIG.get(accountId);
                WXPay wxpay = new WXPay(aNative);

                if (!wxpay.isPayResultNotifySignatureValid(resultMap)) {
                    System.out.println("签名效验失败==============》》》》》》》》》:" + body);
                    return WXPaySdkServiceImpl.setXml("FAIL", "签名效验失败");
                }
                //判断支付是否正常
                if ("SUCCESS".equals(resultMap.get("return_code")) && resultMap.containsKey("result_code") && "SUCCESS".equals(resultMap.get("result_code"))) {
                    //正常交易,进行数据修改
                    JSONObject jsonObj = JSONObject.fromObject(resultMap.get("attach"));
                    String pkId = jsonObj.getString("p");

                    //查询订单是否通知过
                    WechatTradeFlow isHis = wechatTradeFlowService.selectByPrimaryKey(pkId);
                    if (isHis.getExt1().equals("1")) {
                        return WXPaySdkServiceImpl.setXml("SUCCESS", "OK");
                    }

                    //修改微信交易订单信息
                    WechatTradeFlow tradeFlow = new WechatTradeFlow();
                    //=====支付结果信息======//
                    tradeFlow.setId(pkId);//设置主键
                    tradeFlow.setTradeType(resultMap.get("trade_type"));//交易类型
                    tradeFlow.setPayResult(resultMap.get("result_code"));//支付结果
                    tradeFlow.setPayInfo(resultMap.get("attach"));//支付信息
                    tradeFlow.setTransactionId(resultMap.get("transaction_id"));//威富通订单号
                    tradeFlow.setOutTransactionId(resultMap.get("out_trade_no"));//第三方订单号
                    tradeFlow.setFeeType(resultMap.get("fee_type"));//货币种类
                    tradeFlow.setBankType(resultMap.get("bank_type"));//付款银行
                    tradeFlow.setBankBillno(resultMap.get("openid"));//openid
                    tradeFlow.setTimeEnd(DateUtils.str2Date(resultMap.get("time_end"), "yyyyMMddHHmmss"));//支付完成时间
                    //=====修改订单状态======//
                    tradeFlow.setWxStatus("付款完成");
                    tradeFlow.setExt1("1");//设置已经通知
                    int code = wechatTradeFlowService.updateByPrimaryKeySelective(tradeFlow);
                    if (code > 0) {
                        //支付成功
                        return WXPaySdkServiceImpl.setXml("SUCCESS", "OK");
                    }else {
                        logger.error(" ***修改订单错误  >>> code : " + JSONObject.fromObject(resultMap));
                        //返回错误信息
                        return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误");
                    }
                } else {
                    logger.error(" ***修改订单错误  >>> code : " + JSONObject.fromObject(resultMap));
                    //返回错误信息
                    return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误");
                }
            } else {
                logger.error(" *** 支付失败  >>> message : " + body);
                return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(" *** 通知交易订单错误  >>> message : " + e.getMessage() + " >>> body" + body);
            return WXPaySdkServiceImpl.setXml("FAIL", "通知交易订单错误");
        }
    }
}

/**
 *给微信端返回通知结果的工具类,按标准的通知格式
 */
public class WXPaySdkServiceImpl{
      //通过xml 发给微信消息
    public static String setXml(String return_code, String return_msg) {
        SortedMap<String, String> parameters = new TreeMap<String, String>();
        parameters.put("return_code", return_code);
        parameters.put("return_msg", return_msg);
        return "<xml><return_code><![CDATA[" + return_code + "]]>" +
                "</return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>";
    }          
}

统一下单时异步通知地址 notify_url 参数必须是外网可访问的地址,不能是本地IP地址。

http://ip:端口号/地址1/地址2/地址3.jhtml

有虚拟地址的加上虚拟地址。

 

posted @ 2021-03-15 16:03  _情书  阅读(576)  评论(0编辑  收藏  举报