1. 调起微信支付的域名要和微信支付配置的一致,导致无法本地测试
解决方案: 修改本地host文件将配置的域名指向本机, 手机wifi使用本机代理上网。
1. maven中引入开发包
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-WxPay</artifactId>
<version>2.4.0</version>
</dependency>
2. 创建请求需要的参数类。配置信息在application中
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class WxPayProperties {
@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;
}
application配置文件 如下
wx:
pay:
appId: wx12334332341
mchId: 123344123
mchKey: U6gG1CqAqweffffxH8eMuDrvfXFBokr
notifyUrl: http://169b91h550.imwork.net:35084/wx/wxPayNotice
3. 请求示例
BigDecimal paymentAmount = new BigDecimal("0.01");
String ip = getIpAddr();
String platformOrderNumber = WxPayKit.generateStr();
Map<String, String> params = UnifiedOrderModel
.builder()
.appid(wxPayProperties.getAppId())
.mch_id(wxPayProperties.getMchId())
.nonce_str(platformOrderNumber)
.body("微信支付")
.out_trade_no(platformOrderNumber)
.total_fee(String.valueOf((paymentAmount.multiply(new BigDecimal("100"))).intValue()))
.spbill_create_ip(ip)
.notify_url(wxPayProperties.getNotifyUrl())
.trade_type(TradeType.MWEB.getTradeType())
.build()
.createSign(wxPayProperties.getMchKey(), SignType.MD5);
String xmlResult = WxPayApi.pushOrder(false, params);
Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
if (StringUtils.equals(resultMap.get("return_code"),"SUCCESS")) {
String url = resultMap.get("mweb_url") + "&redirect_url=http://www.baidu.com"
....
}
redirect_url 为支付成功和支付失败后的重定向地址
获取客户端IP地址
private String getIpAddr() {
String ip = request.getHeader("x-forwarded-for");
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
if (ip.indexOf(",") != -1) {
ip = ip.split(",")[0];
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip != null ? ip : "192.168.0.1";
}
异步通知
@PostMapping("/notifyUrl")
public void notifyUrl(@RequestBody String xmlData) {
Map<String, String> resultMap = WxPayKit.xmlToMap(xmlData);
String platformOrderNumber = resultMap.get("out_trade_no");
BigDecimal paymentAmount = new BigDecimal(resultMap.get("cash_fee"));
String transactionId = resultMap.get("transaction_id");
String timeEnd = resultMap.get("timeEnd");
....
}