微信扫码(Native)支付示例源码

Controller

@RequestMapping(value = {"/api/wxjspay" })
@RestController
@Slf4j
@Api(value = "微信扫码支付相关",tags = "微信扫码支付相关")
public class TenJSPayController extends BaseController {

    @Autowired
    private TenPayService tenPayService;

    /**
     * @Description: 微信扫码付支付
     */
    @PostMapping(value = "/payRequest")
    @ApiOperation("微信扫码付支付")
    public Result payRequest(@RequestBody MallOrderJSPayDto mallOrderPayDto, HttpServletRequest request){
        Map<String, String> map = new HashMap<String, String>();
        try {
            map =  tenPayService.wxQrPayment(mallOrderPayDto);
            return super.success(map);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.error();
    }


    /**
     * @Description: 微信扫码付支付回调
     */
    @PostMapping(value = "/tenPayOrderCallBack")
    @ApiOperation("微信扫码付支付回调")
    public Map<String, String> tenPayOrderCallBack(HttpServletRequest request){
        Map<String, String> map = new HashMap<String, String>();
        try {
            tenPayService.tenJSPayCallBack(request);
            map.put("return_code", "SUCCESS");
            map.put("return_msg", "OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }


    /**
     * @Description: 微信扫码付订单状态查询
     */
    @PostMapping(value = "/getWxJspayStatus")
    @ApiOperation("微信扫码付订单状态查询")
    public Result getWxJspayStatus(@RequestParam("orderId")String orderId){
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            map = tenPayService.getWxJspayStatus(orderId);
            return super.success(map);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return super.error();
    }
}

service:

public interface TenPayService {

    public Map<String, String> wxQrPayment(MallOrderJSPayDto mallOrderPayDto) throws Exception;

    public TenPayVO tenJSPayCallBack(HttpServletRequest request) throws Exception;

    public Map<String, Object> getWxJspayStatus(String orderId)throws Exception;

    }

Impl:

 @Override
    public Map<String, String> wxQrPayment(MallOrderJSPayDto mallOrderPayDto) throws Exception {

        TenpayConfig tenpayConfig = new TenpayConfig();
        tenpayConfig.setAppId("");
        tenpayConfig.setKey("");
        tenpayConfig.setMchId("");
        tenpayConfig.setPackageValue(Consts.PACKAGE_VALUE);

        MyPayConfig myPayConfig = new MyPayConfig(tenpayConfig);

        WXPay wxPay = new WXPay(myPayConfig);

        //微信统一下单
        Map<String,String> paramsMap = new HashMap<>();

        //随机字符串
        String nonce_str =  WXPayUtil.generateNonceStr();

        paramsMap.put("nonce_str", nonce_str);
        paramsMap.put("sign_type","MD5");
        //描述
        paramsMap.put("body", "扫码下单");
        //商户订单号(支付编号)
        //支付编号
        String orderNum = PayUtils.getOrderNumber();
        paramsMap.put("out_trade_no", orderNum);
        //支付金额,金额单位为 分

        BigDecimal totalAmount = null;
      
        //TODO 测试使用
        int totalFee = (int) (1);
        paramsMap.put("total_fee", String.valueOf(totalFee));
        //回调地址
        paramsMap.put("notify_url", Consts.TENPAY_QR_CALLBACK);
        //交易类型
        paramsMap.put("trade_type", Consts.TRADE_TYPE_NATIVE);
        //用户端ip
        String spbillCreateIp = "";
        InetAddress inetAddress = InetAddress.getLocalHost();
        if (inetAddress != null) {
            spbillCreateIp = inetAddress.getHostAddress();
        }
        paramsMap.put("spbill_create_ip", spbillCreateIp);


        Map<String,String> resp = wxPay.unifiedOrder(paramsMap);


        byte[] bytes = QRCodeUtil.encodeReturnFile(resp.get("code_url"));

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);

        MultipartFile temFile = new MockMultipartFile("file", byteArrayInputStream);
        byteArrayInputStream.close();

        String url = ossUtil.upload(temFile);

        log.info("url:{}",url);

        Map<String,String> mapReturn = Maps.newHashMap();
        mapReturn.put("url",url);
        mapReturn.put("orderNum",orderNum);

        return mapReturn;

    }

    @Override
    public TenPayVO tenJSPayCallBack(HttpServletRequest request) throws Exception {

        log.info("weixinpay callBack start ==============================");
        InputStream inputStream = request.getInputStream();
        StringBuffer resXml = new StringBuffer();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        String str;
        while ((str = bufferedReader.readLine()) != null) {
            resXml.append(str);
        }
        bufferedReader.close();
        inputStream.close();
        log.info("微信回调报文: " + resXml);
//        TenPayVO tenPayVO = this.tenPayCallBackInfo(resXml.toString(), "xml", "");

        Map<String, Object> resHashMap = (Map<String, Object>) TenPayUtils.readXml(resXml.toString(), "xml", "");
        SortedMap<String, Object> resMap = new TreeMap<String, Object>(resHashMap);
        log.info(" 微信支付回调返回结果:{}",resMap);
        //微信返回状态码
        if (!resMap.get("return_code").equals("SUCCESS")) {
            log.error("微信支付回调连接失败: " + resMap.get("return_msg"));
            throw new Exception("微信支付回调连接失败");
        }
        //业务结果
        if (!resMap.get("result_code").equals("SUCCESS")) {
            log.error("err_code: " + resMap.get("err_code"), "err_code_des: " + resMap.get("err_code_des"));
            throw new Exception(resMap.get("err_code_des").toString());
        }
        TenPayUtils tenPayUtils = new TenPayUtils();
        //校验签名-要传递加签用的key
        String sign = tenPayUtils.createSign(resMap, "UTF-8","key");
        if (!sign.equals(resMap.get("sign"))) {
            log.error("微信支付回调签名不正确");
            throw new Exception("微信支付回调签名不正确");
        }
        TenPayVO tenPayVO = new TenPayVO();
        //商户订单号
        tenPayVO.setOutTradeNo((String) resMap.get("out_trade_no"));
        //业务结果
        tenPayVO.setResultCode((String) resMap.get("result_code"));
        //签名方式
        tenPayVO.setSignType(Consts.SIGN_TYPE);
        //签名
        tenPayVO.setSign((String) resMap.get("sign"));
        //交易类型
        tenPayVO.setTradeType(Consts.TRADE_TYPE_NATIVE);
        //交易状态
        tenPayVO.setTradeState((String) resMap.get("trade_state"));
        //商户号
        tenPayVO.setMchId((String) resMap.get("mch_id"));
        //付款银行
        tenPayVO.setBankType((String) resMap.get("bank_type"));
        //交易金额
        BigDecimal totalFee = new BigDecimal((String) resMap.get("total_fee"));
        totalFee = totalFee.divide(new BigDecimal(100));
        tenPayVO.setTotalFee(totalFee);
        //币种
        if (resMap.containsKey("fee_type")) {
            tenPayVO.setFeeType((String) resMap.get("fee_type"));
        }
        //微信支付订单号
        tenPayVO.setTransactionId((String) resMap.get("transaction_id"));
        //支付完成时间
        tenPayVO.setTimeEnd((String) resMap.get("time_end"));

        if (tenPayVO != null && tenPayVO.getResultCode().equals("SUCCESS")){
            log.info("微信扫码付回调成功==================");
        }

        return null;
    }

    @Override
    public Map<String, Object> getWxJspayStatus(String orderId) throws Exception {

        TenpayConfig tenpayConfig = new TenpayConfig();

        tenpayConfig.setAppId("");
        tenpayConfig.setKey("");
        tenpayConfig.setMchId("");
        tenpayConfig.setPackageValue(Consts.PACKAGE_VALUE);
        MyPayConfig myPayConfig = new MyPayConfig(tenpayConfig);
        WXPay wxPay = new WXPay(myPayConfig);

        Map<String, String> paramsMap = new HashMap<>();

        //随机字符串
        String nonce_str =  WXPayUtil.generateNonceStr();
        paramsMap.put("nonce_str", nonce_str);
        paramsMap.put("out_trade_no", orderId);

        Map<String,String> resp  = wxPay.orderQuery(paramsMap);
        log.info("resp:{}",resp);

        Map<String,Object> maps = Maps.newHashMap();
        maps.put("type",Objects.nonNull(resp.get("result_code")) &&  resp.get("result_code").equals("SUCCESS") ? 0 : resp.get("result_code"));
        maps.put("data",resp.get("trade_state_desc"));

        return maps;
    }

上传二维码到阿里云就不写了,有需要的同学可以去找一下我上一篇支付宝扫码付中有.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值