常见错误 强烈建议阅读完再搞避免踩坑多花冤枉钱
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);
}
}