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

Posted 大橘为重

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信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的库

<dependency>
    <groupId>com.github.javen205</groupId>
    <artifactId>IJPay-WxPay</artifactId>
    <version>2.7.3</version>
</dependency>

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<String, String> 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<String, String> 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<String, String> 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<String, String> xml = new HashMap<String, String>(2);
            xml.put("return_code", "SUCCESS");
            xml.put("return_msg", "OK");
            return WxPayKit.toXml(xml);
        }
    }

以上是关于微信PC网站支付采坑记-微信Native支付申请接入的主要内容,如果未能解决你的问题,请参考以下文章

企业如何申请支付宝,微信等接口

个人的网站如何对接支付宝和微信的支付接口?自己的网站急需接入支付接口,有没有大佬指点一下?

微信支付

微信支付

微信支付

微信H5网页公众号外支付接入攻略demo