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