微信在线支付实现步骤:
第一步:申请微信支付账号
前往 微信支付官网 进行注册和登录。 在商户平台中,申请成为微信商户,获取商户号、AppID、AppSecret、商户API密钥等信息。
第二步:引入依赖
在您的项目中,引入微信支付的相关依赖。例如,使用微信官方提供的 Java SDK。
<!-- 微信支付 SDK依赖 --> <dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>xxx</version>
</dependency>
第三步:配置支付信息
在您的项目配置文件中,填入微信支付的相关信息,如商户号、AppID、AppSecret、商户API密钥等,创建配置读取类WxPayConfig 。
# 微信支付配置
wechat.pay.mch-id=xxxxxx
wechat.pay.app-id=xxxxxx
wechat.pay.app-secret=xxxxxx
wechat.pay.api-key=xxxxxx
//读取配置信息
public class WxPayConfig {
/**
* 商户号
*/
private String mchId;
/**
* 商户API证书序列号
*/
private String mchSerialNo;
/**
* 商户私钥文件
*/
private String privateKeyPath;
/**
* APIv3密钥
*/
private String apiV3Key;
/**
* APPID
*/
private String appid;
/**
* 微信服务器地址
*/
private String domain;
/**
* 接收结果通知地址
*/
private String notifyDomain;
/**
* APIv2密钥
*/
private String partnerKey;
/**
* 获取商户的私钥文件
* @param filename
* @return
*/
public PrivateKey getPrivateKey(String filename){
try {
return PemUtil.loadPrivateKey(new FileInputStream(filename));
} catch (FileNotFoundException e) {
throw new RuntimeException("私钥文件不存在", e);
}
}
/**
* 获取签名验证器
* @return
*/
@Bean
public ScheduledUpdateCertificatesVerifier getVerifier(){
log.info("获取签名验证器");
//获取商户私钥
PrivateKey privateKey = getPrivateKey(privateKeyPath);
//私钥签名对象
PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
//身份认证对象
WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
// 使用定时更新的签名验证器,不需要传入证书
ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(
wechatPay2Credentials,
apiV3Key.getBytes(StandardCharsets.UTF_8));
return verifier;
}
第四步:生成预支付订单
使用微信支付的 API,通过发送请求生成预支付订单。您需要提供订单金额、商品描述、用户OpenID等信息。
/**
* 创建订单,调用Native支付接口
* @param productId
* @return code_url 和 订单号
* @throws Exception
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Map<String, Object> nativePay(Long productId) throws Exception {
log.info("生成订单");
//生成订单
OrderInfo orderInfo = orderInfoService.createOrderByProductId(productId, PayType.WXPAY.getType());
String codeUrl = orderInfo.getCodeUrl();
if(orderInfo != null && !StringUtils.isEmpty(codeUrl)){
log.info("订单已存在,二维码已保存");
//返回二维码
Map<String, Object>