1.maven導入wxpay-sdk-3.0.9
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>3.0.9</version>
</dependency>
sdk下載地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
注:下載後請自行打成jar包
2.新建WxConfig 繼承sdk裏面的WXPayConfig
package com.liaoin.tourism.config;
import com.github.wxpay.sdk.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class WxConfig extends WXPayConfig {
private byte[] certData;
//如不需要更換appID就直接寫死 例:private String toAppId = "xxxxxx";
private String toAppId;
public String getToAppId() {
return toAppId;
}
public void setToAppId(String toAppId) {
this.toAppId = toAppId;
}
public String getAppID() {
return toAppId;
}
// 支付商戶平臺的商戶id
public String getMchID() {
return "xxxx";
}
public String getKey() {
return "xxxx";
}
public WxConfig() throws Exception { // 構造方法讀取證書, 通過getCertStream 可以使sdk獲取到證書
String certPath = "C:\\Users\\admin\\Desktop\\xxx\\pay\\1500120982_20200407_cert/apiclient_cert.p12";
File file = new File(certPath);
InputStream certStream = new FileInputStream(file);
this.certData = new byte[(int) file.length()];
certStream.read(this.certData);
certStream.close();
}
@Override
public InputStream getCertStream() {
return new ByteArrayInputStream(this.certData);
}
@Override
public IWXPayDomain getWXPayDomain() { // 這個方法需要這樣實現, 否則無法正常初始化WXPay
IWXPayDomain iwxPayDomain = new IWXPayDomain() {
@Override
public void report(String domain, long elapsedTimeMillis, Exception ex) {
}
@Override
public DomainInfo getDomain(WXPayConfig config) {
return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
}
};
return iwxPayDomain;
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
}
3.新建WxPayUtil工具類
package com.liaoin.tourism.util;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.liaoin.tourism.business.tourismOrder.parameter.IcbcParameter;
import com.liaoin.tourism.common.constant.VariableConstants;
import com.liaoin.tourism.config.WxConfig;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class WxPayUtil {
public static WXPay getWXPay(String appId) {
WxConfig config;
WXPay wxpay = null;
try {
config = new WxConfig();
config.setToAppId(appId);
wxpay = new WXPay(config);
} catch (Exception e) {
log.error("WXPay初始化失敗.");
e.printStackTrace();
}
return wxpay;
}
public static WxConfig getWxConfig(String appId) {
WxConfig config = null;
try {
config = new WxConfig();
config.setToAppId(appId);
} catch (Exception e) {
log.error("獲取WxConfig失敗.");
e.printStackTrace();
}
return config;
}
//微信回調地址
public static final String wxNotifyUrlServlet = "www.baidu.com";
/**
* 小程序下單
*
* @param
* data.put("body", "騰訊充值中心-QQ會員充值");
* data.put("out_trade_no", "test2020090910595900000012");
* data.put("device_info", "WEB");
* data.put("fee_type", "CNY");
* data.put("total_fee", "1");
* data.put("spbill_create_ip", "58.17.241.195");
* data.put("notify_url", "http://www.example.com/wxpay/notify");
* data.put("trade_type", "JSAPI"); // 此處指定爲掃碼支付
* data.put("product_id", "12");
* @return
*/
public static Map<String, String> createMiniProgramTradePay(Integer datasorce,String orderType,String body,String outTradeNo,String total_fee,String ip,String openid) {
WXPay wxPay = null;
WxConfig wxConfig = null;
Map<String, String> payParam = new HashMap<String, String>();
payParam.put("body", body);//"測試織金洞微信支付"
payParam.put("out_trade_no", outTradeNo);//"test2020090910595900000012"
payParam.put("device_info", "WEB");
payParam.put("fee_type", "CNY");
payParam.put("total_fee", total_fee); //"1"
payParam.put("spbill_create_ip", ip);//"58.17.241.195"
payParam.put("notify_url", wxNotifyUrlServlet); // 回調地址
if (datasorce == 1){
payParam.put("trade_type", "NATIVE"); // 此處指定爲掃碼支付
}else{
payParam.put("trade_type", "JSAPI"); // 此處指定爲掃碼支付
}
payParam.put("product_id", "12");
payParam.put("openid",openid);//"oTZW-4jVzZ3GnvfNtbwv8TPhI5K8"
payParam.put("attach","2"); // 附加信息
String tpAppId = getWxAppId(orderType);
if (tpAppId != null){
payParam.put("appid",tpAppId); //應用的appId
wxPay = getWXPay(tpAppId);
wxConfig = getWxConfig(tpAppId);
}
Map<String, String> result = new HashMap<>();
try {
Map<String, String> resp = wxPay.unifiedOrder(payParam);
log.info("微信支付下單成功, 返回值 response={}", resp);
String returnCode = resp.get("return_code");
if (!"SUCCESS".equals(returnCode)) {
return null;
}
String resultCode = resp.get("result_code");
if (!"SUCCESS".equals(resultCode)) {
return null;
}
String prepay_id = resp.get("prepay_id");
if (prepay_id == null) {
return null;
}
if (datasorce == 1){
String code_url = resp.get("code_url");
if (code_url !=null){
Map<String,String> qrcode = new HashMap<>();
qrcode.put("qrcode",code_url);
return qrcode;
}
}
// ******************************************
// 前端調起微信支付必要參數
// ******************************************
String packages = "prepay_id=" + prepay_id;
Map<String, String> wxPayMap = new HashMap<String, String>();
wxPayMap.put("appId", wxConfig.getAppID());
wxPayMap.put("timeStamp", String.valueOf(System.currentTimeMillis()));
wxPayMap.put("nonceStr", StringUtil.generateRandomCode(false, 6));
wxPayMap.put("package", packages);
wxPayMap.put("signType", "MD5");
// 加密串中包括 appId timeStamp nonceStr package signType 5個參數, 通過sdk WXPayUtil類加密, 注意, 此處使用 MD5加密 方式
String sign = WXPayUtil.generateSignature(wxPayMap, wxConfig.getKey());
// ******************************************
// 返回給前端調起微信支付的必要參數
// ******************************************
result.put("prepay_id", prepay_id);
result.put("paySign", sign);
result.putAll(wxPayMap);
} catch (Exception e) {
log.error("微信下單失敗. Method:{},訂單號:{}", "createMiniProgramTradePay", payParam.get("out_trade_no"));
e.printStackTrace();
}
return result;
}
public static Map<String,String> closeOrder(String outTradeNo){
WXPay wxpay = getWXPay("");
Map<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", outTradeNo);
try {
Map<String, String> resp = wxpay.closeOrder(data);
return resp;
} catch (Exception e) {
log.error("微信關閉訂單失敗. Method:{},訂單號:{}", "closeOrder", outTradeNo);
e.printStackTrace();
}
return null;
}
/**
* 訂單查詢
*
* @param outTradeNo
* @return
*/
public static Map<String, String> orderQuery(String orderType,String outTradeNo) {
WXPay wxpay = getWXPay(getWxAppId(orderType));
Map<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", outTradeNo);
try {
Map<String, String> resp = wxpay.orderQuery(data);
return resp;
} catch (Exception e) {
log.error("微信訂單號查詢失敗. Method:{},訂單號:{}", "orderQuery", outTradeNo);
e.printStackTrace();
}
return null;
}
public static Boolean orderQueryState(String orderType,String outTradeNo){
WXPay wxpay = getWXPay(getWxAppId(orderType));
Map<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", outTradeNo);
try {
Map<String, String> resp = wxpay.orderQuery(data);
if (resp.get("trade_state") == null || !resp.get("trade_state").equalsIgnoreCase("SUCCESS")){
return false;
}
return true;
} catch (Exception e) {
log.error("微信訂單號查詢失敗. Method:{},訂單號:{}", "orderQuery", outTradeNo);
e.printStackTrace();
}
return false;
}
/**
* 退款查詢
*
* @param outTradeNo
* @return
*/
public static Map<String, String> refundQuery(String outTradeNo) {
WXPay wxpay = getWXPay("");
Map<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", outTradeNo);
try {
Map<String, String> resp = wxpay.refundQuery(data);
return resp;
} catch (Exception e) {
log.error("微信退款查詢失敗. Method:{},訂單號:{}", "refundQuery", outTradeNo);
e.printStackTrace();
}
return null;
}
/**
* 退款接口
* @param outTradeNo 訂單號
* @param outRefundNo 退款號
* @param refundFee 退款金額
* @return
*/
public static Map<String, String> refund(String outTradeNo,String outRefundNo,String refundFee,String notifyUrl){
WXPay wxpay = getWXPay("");
Map<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", outTradeNo);
data.put("out_refund_no", outRefundNo);
data.put("refund_fee", refundFee);
data.put("notify_url", notifyUrl);
try {
Map<String, String> resp = wxpay.refund(data);
return resp;
} catch (Exception e) {
log.error("微信退款查詢失敗. Method:{},訂單號:{},退款單號:{}", "refund", outTradeNo,outRefundNo);
e.printStackTrace();
}
return null;
}
public static String getWxAppId(String orderType){
String tpAppId = VariableConstants.STRING_CONSTANT_1.equals(orderType)||VariableConstants.STRING_CONSTANT_2.equals(orderType)||VariableConstants.STRING_CONSTANT_3.equals(orderType)?
IcbcParameter.hotelAppId:
VariableConstants.STRING_CONSTANT_5.equals(orderType)?IcbcParameter.distributionAppId:
VariableConstants.STRING_CONSTANT_4.equals(orderType)?IcbcParameter.mallAppId:null;
return tpAppId;
}
public static void main(String arg[]) {
// Map<String, String> data = new HashMap<String, String>();
// data.put("body", "測試微信支付");
// data.put("out_trade_no", "test2020090910595900000012");
// data.put("device_info", "WEB");
// data.put("fee_type", "CNY");
// data.put("total_fee", "1");
// data.put("spbill_create_ip", "58.17.241.195");
// data.put("notify_url", "http://www.example.com/wxpay/notify");
// data.put("trade_type", "NATIVE"); // 此處指定爲掃碼支付
// data.put("product_id", "12");
// data.put("openid","oTZW-4jVzZ3GnvfNtbwv8TPhI5K8");
// 測試下單接口
createMiniProgramTradePay(1,"2","測試微信掃碼支付","test2020090910595900120012","1","58.17.241.195","oTZW-4jVzZ3GnvfNtbwv8TPhI5K8");
// 測試查詢接口
orderQueryState("3","1249895377172303872");
}
}