Native支付
微信支付官方文档https://pay.weixin.qq.com/wiki/doc/api/index.html
微信支付首先需要两个账号
微信公众平台:https://mp.weixin.qq.com/
微信商户平台:https://pay.weixin.qq.com/index.php/core/home/login
商户号可以有很多都对应一个公众号
两者需关联
不然会出现商户ID和APPID不匹配
微信支付目前有七种,本文主要介绍Native支付相关流程
微信支付配置文件
证书和秘钥每个商户都要使用不同的
如果写错或用错,当你在下单验证时会一直通知签名失败
准备好配置文件后引入微信的JAVA工具包
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
微信的配置类
import com.github.wxpay.sdk.WXPayConfig;
import org.springframework.core.io.ClassPathResource;
import java.io.InputStream;
public class IWxPayConfig implements WXPayConfig {
private String app_id = "可以从公众平台或商户平台的开发配置中找到";
private String key = "商户平台的API秘钥";
private String mch_id = "商户平台的商户号";
private int conn_timeout = 8000;
private int read_timeout = 10000;
private InputStream inputStream;
public IWxPayConfig() throws Exception {
//加载对应商户平台的安全证书
ClassPathResource classPathResource = new ClassPathResource("wxpay/apiclient_cert.p12");
this.inputStream = classPathResource.getInputStream();
inputStream.close();
}
@Override
public String getAppID() {
return this.app_id;
}
@Override
public String getMchID() {
return this.mch_id;
}
@Override
public String getKey() {
return this.key;
}
@Override
public InputStream getCertStream() {
return this.inputStream;
}
@Override
public int getHttpConnectTimeoutMs() {
return this.conn_timeout;
}
@Override
public int getHttpReadTimeoutMs() {
return this.read_timeout;
}
}
native支付方法
使用的是native微信支付模式二
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
/**
* 功能描述:native支付
*/
public static Map<String, String> nativeApiPay() {
try {
IWxPayConfig iWxPayConfig = new IWxPayConfig();
// 注入自己实现的微信配置类, 创建WXPay核心类
WXPay wxpay = new WXPay(iWxPayConfig);
// 封装下单参数
Map<String, String> data = new HashMap<>();
data.put("appid", iWxPayConfig.getAppID());
data.put("mch_id", iWxPayConfig.getMchID()); // 商户号
data.put("nonce_str", WXPayUtil.generateNonceStr());// 随机字符串
data.put("body", "网上商城"); // 订单
data.put("out_trade_no", IDUtils.getUUId()); // 订单唯一编号, 不允许重复
data.put("total_fee", "1"); // 订单金额 单位分
data.put("spbill_create_ip", "用户真实IP"); // 终端ip
data.put("notify_url", "回调的接口,需要在商户平台中设置"); // 订单结果通知, 微信主动回调此接口
data.put("trade_type", "NATIVE"); // 固定填写
data.put("product_id", "1");
data.put("receipt", "Y");
data.put("fee_type", "CNY"); // 默认人民币
// 签名数据
System.out.println("data:" + JsonUtils.objectToJson(data));
String sign = WXPayUtil.generateSignature(data, iWxPayConfig.getKey(), WXPayConstants.SignType.MD5);
//验证签名
data.put("sign", sign);
/** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
Map<String, String> msg = wxpay.unifiedOrder(data);
logger.info("微信支付下单结果" + msg);
Map<String, String> wxPayMap = new HashMap<>();
wxPayMap.put("return_code", msg.get("return_code"));
wxPayMap.put("return_msg", msg.get("return_msg"));
//返回给前端的支付链接,由前端转换成二维码供用户扫描接口
wxPayMap.put("code_url", msg.get("code_url"));
return wxPayMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
验签
微信支付签名是要加密你需要提交的所有信息
然后再吧签名+其余信息一起提交下单
验签失败
如果显示验签失败大概率是密钥和证书的问题
如有其余疑问请在评论区留言,感谢您的阅读