微信PC网站支付采坑记-微信Native支付申请接入

常见错误 强烈建议阅读完再搞避免踩坑多花冤枉钱

1、该ID未完成微信认证,请确认后再试

         完成appid的认证,微信服务号为企业认证,开放平台为开发者认证。

2、你输入的APPID认证主体名称与实际认证主体不一致,请检查修改后重试

        检查开放平台或者公众平台认证主体和商户号主体是否一致。

3、不支持关联该类型的appID

微信Native支付(PC网站)不能用开放平台的appid.
 微信Native支付的appid 必须为 **微信服务号** 即认证主体为企业的公众号。
   微信Native支付的appid 必须为**微信服务号** 即认证主体为企业的公众号。
     微信Native支付的appid 必须为**微信服务号**即认证主体为企业的公众号。

4、修改支付时提示的收款方名称

    收款方名称要修改商户号里面的商户简称
    

微信Native支付申请流程

1、 申请微信商户号
2、 申请微信企业服务号并且认证,拿到appid
3、 将服务号的appid与商户号绑定
4、申请证书key之类的

微信Native支付接入

java开发 推荐使用IJPay
1、引入ijpay的库


    com.github.javen205
    IJPay-WxPay
    2.7.3

2、创建请求需要的参数类。配置信息在application中

public class WxPayConfig {
    /**
     * 设置微信公众号或者小程序等的appid.
     */
    @Value("${wx.pay.appId}")
    private String appId;

    /**
     * 微信支付商户号.
     */
    @Value("${wx.pay.mchId}")
    private String mchId;

    /**
     * 微信支付商户密钥.
     */
    @Value("${wx.pay.mchKey}")
    private String mchKey;

    /**
     * 异步回调地址
     */
    @Value("${wx.pay.notifyUrl}")
    private String notifyUrl;
}

3、配置信息application.properties

wxpay.appId=申请的服务号的appid
wxpay.appSecret=申请的服务号的appSecret
wxpay.mchId=申请的商户号
wxpay.partnerKey=商户号的partnerKey
wxpay.certPath=商户号p12证书
wxpay.domain=扫码支付完成的异步校验通知url

4、统一下单

  Map params = UnifiedOrderModel
                .builder()
                .appid(wxPayConfig.appId)
                .mch_id(wxPayConfig.mchId)
                .nonce_str(WxPayKit.generateStr())
                .body("赵汤圆支付")
                .attach("赵汤圆支付踩坑")
                .out_trade_no(createOrderRequestDto.getId())
                .total_fee(total_fee)
                .spbill_create_ip(ip)
                .notify_url(wxPayConfig.domain)
                .trade_type(TradeType.NATIVE.getTradeType())
                .build()
                .createSign(wxPayConfig.partnerKey, SignType.HMACSHA256);
        String xmlResult = WxPayApi.pushOrder(false, params);
        Map result = WxPayKit.xmlToMap(xmlResult);
        String returnCode = result.get("return_code");
        String returnMsg = result.get("return_msg");
        System.out.println(returnMsg);
        if (!WxPayKit.codeIsOk(returnCode)) {
                    // 异常状态判断 替换成你自己的
            throw new ServiceException(ErrorTypeEnum.RECHARGE_ERROR);
        }
        String resultCode = result.get("result_code");
        if (!WxPayKit.codeIsOk(resultCode)) {
                // 异常状态判断 替换成你自己的
            throw new ServiceException(ErrorTypeEnum.RECHARGE_ERROR);
        }
        //生成预付订单success
        String qrCodeUrl = result.get("code_url");
        try {
            // 生成下单的二维码,返回给客户端显示
                        ByteArrayOutputStream out = new ByteArrayOutputStream();
            QrCodeKit.encodeOutPutSteam(out, qrCodeUrl, BarcodeFormat.QR_CODE,
                    3, ErrorCorrectionLevel.H, "png", 200, 200);
            BASE64Encoder encoder = new BASE64Encoder();
            imgBase64Str = encoder.encode(out.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return imgBase64Str;
5、异步通知
```java
String xmlMsg = HttpKit.readData(request);
    logger.info("支付通知=" + xmlMsg);
    Map params = WxPayKit.xmlToMap(xmlMsg);

    String returnCode = params.get("return_code");

    // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
    // 注意此处签名方式需与统一下单的签名类型一致
    if (WxPayKit.verifyNotify(params, wxPayConfig.partnerKey, SignType.HMACSHA256)) {
        if (WxPayKit.codeIsOk(returnCode)) {
            // 更新订单信息
            // 发送通知等
            String out_trade_no = params.get("out_trade_no");
            String total_fee = params.get("total_fee");
            Map xml = new HashMap(2);
            xml.put("return_code", "SUCCESS");
            xml.put("return_msg", "OK");
            return WxPayKit.toXml(xml);
        }
    }

你可能感兴趣的:(微信)