微信支付文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml
微信支付SDK地址:https://github.com/wechatpay-apiv3/wechatpay-java
一、开通支付产品、获取相关配置参数
参数 | 参数描述 |
---|---|
appid | 公众账号ID(可以在开放平台查看,一般是wx开头) |
mch_id | 商户号(可以在商户平台查看) |
key | 商户APIV3密钥 (可以在商户平台查看设置) |
merchant_serial_number | 商户证书序列号 (可以在商户平台查看设置) |
二、后端生成订单,返回支付参数
1、加入依赖
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.9</version>
</dependency>
2、微信支付配置参数
/**
* @ClassName: WxPayConfig
* @Description: 微信支付配置参数
* @Version 1.0
*/
public final class WxPayConfig {
// 应用ID
public final static String appId = "wx*********";
// 商户ID
public final static String mchId = "1*********";
// 回调地址
public final static String notifyUrl = "http://***.com/pay/notify";
/** 商户API私钥文件路径 */
public final static String privateKeyPath = "apiclient_key.pem";
/** 商户证书序列号 */
public final static String merchantSerialNumber = "******";
/** 商户APIV3密钥 */
public final static String apiV3key = "******";
}
3、微信支付Controller类
@Controller
@RequestMapping("/pay")
public class PayController {
@Autowired
private WxPayService wxPayService;
/**
* 微信支付 Jsapi
*/
@RequestMapping(value = "/createOrder", method = RequestMethod.GET)
@ResponseBody
public Map createOrder() {
// 订单号
String out_trade_no= "123456789";
// 支付金额,单位分
Integer money = 100;
// 用户小程序openid
String openid = "******";
// 商品描述
String description = "测试商品";
Map result = wxPayService.jsapiPayV3(out_trade_no, money, openid, description);
return result;
}
}
4、微信支付服务类
public interface WxPayService {
Map<String, String> jsapiPayV3(String out_trade_no, Integer money, String openid, String description);
}
@Service
public class WxPayServiceImpl implements WxPayService {
@Override
public Map<String, String> jsapiPayV3(String out_trade_no, Integer money, String openid, String description) {
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId(WxPayConfig.mchId)
.privateKeyFromPath(WxPayConfig.privateKeyPath)
.merchantSerialNumber(WxPayConfig.merchantSerialNumber)
.apiV3Key(WxPayConfig.apiV3key)
.build();
JsapiServiceExtension jsapiService = new JsapiServiceExtension.Builder().config(config).build();
Amount amount = new Amount();
amount.setTotal(money);
Payer payer = new Payer();
payer.setOpenid(openid);
PrepayRequest preRequest = new PrepayRequest();
preRequest.setAmount(amount);
preRequest.setAppid(WxPayConfig.appId);
preRequest.setMchid(WxPayConfig.mchId);
preRequest.setDescription(description);
preRequest.setNotifyUrl(WxPayConfig.notifyUrl);
preRequest.setOutTradeNo(out_trade_no);
preRequest.setPayer(payer);
PrepayWithRequestPaymentResponse responses = jsapiService.prepayWithRequestPayment(preRequest);
Map<String, String> payParameters = new HashMap<>();
payParameters.put("timestamp", responses.getTimeStamp());
payParameters.put("packageVal", responses.getPackageVal());
payParameters.put("nonceStr", responses.getNonceStr());
payParameters.put("signType", responses.getSignType());
payParameters.put("paySign", responses.getPaySign());
return payParameters;
}
}
三、小程序中根据接口返回参数,发起支付
// 根据接口返回参数
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'RSA',
paySign: '',
success (res) {
console.log('pay success', res)
},
fail (err) {
console.error('pay fail', err)
}
})