經過昨天一天的奮戰終於在今天測試並支付成功,開心啊哈哈哈,長話短說,代碼僅是測試的demo,經過測試可以支付成功,代碼優化你們自己來哈
1:引入pom依賴
在mvn中沒有找到,只找到了下面這個版本
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
demo中的目錄結構,提供的接口中生成簽名、xml等接口都是現成直接調用即可
2:配置相關參數 (除了官網規定必傳的之外其他的可以在用到的時候慢慢改或者添加)
abc.properties配置
wx_appId=appid
wx_appSecret= adsfsadfasdfasdfasdf
wx_key=key
mchID=mch_id
certLocalPath= apiclient_cert.p12
certPassword= pwd
ip=192.168.1.1
trade_type=JSAPI
3:讀取配置
import java.io.*;
import java.util.*;
/**
* @Title: WXPayConfig
* @Description: 微信支付配置項demo
* @author wdz
* @date 2019/3/5 9:33
*/
public class WXPayConfig {
public static Logger log = Logger.getLogger(WXPayConfig.class);
public static SortedMap<String, String> getWXPayConfig(){
SortedMap<String, String> map = new TreeMap<>();
Properties pro = new Properties();
try {
InputStream in = WXPayConfig.class.getResourceAsStream("/payInfo.properties");
pro.load(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
log.info("找不到文件:payInfo.properties");
} catch (IOException e) {
e.printStackTrace();
log.info("讀取文件異常。。。。。。");
}
map.put("appid",pro.getProperty("wx_appId"));
map.put("mch_id",pro.getProperty("mchID"));
map.put("sign_type","MD5");
map.put("wx_appSecret",pro.getProperty("wx_appSecret"));
map.put("key",pro.getProperty("wx_key"));
map.put("certLocalPath",pro.getProperty("certLocalPath"));
map.put("certPassword",pro.getProperty("certPassword"));
map.put("spbill_create_ip",pro.getProperty("ip"));
map.put("trade_type",pro.getProperty("trade_type"));
map.put("timeStamp",System.currentTimeMillis()+"");
return map;
}
}
4:生成32位字符串
public static String getRandomStr(int len) {
StringBuilder str = new StringBuilder("123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
StringBuilder sb = new StringBuilder();
Random r = new Random();
int range = str.length();
for (int i = 0; i < len; i++) {
sb.append(str.charAt(r.nextInt(range)));
}
return sb.toString();
}
5:接口繼承
import com.github.wxpay.sdk.WXPayConfig;
import java.io.InputStream;
public interface IWXPayConfig extends WXPayConfig {
String getAppID();
String getMchID();
String getKey();
InputStream getCertStream();
int getHttpConnectTimeoutMs();
int getHttpReadTimeoutMs();
}
6:接口實現
import com.yunchao.hsh.pay.config.WXPayConfig;
import com.yunchao.hsh.pay.interfaces.IWXPayConfig;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.util.SortedMap;
@Service
public class WXPayConfigService implements IWXPayConfig {
private SortedMap<String, String> map = WXPayConfig.getWXPayConfig();
@Override
public String getAppID() {
return map.get("appid");
}
@Override
public String getMchID() {
return map.get("mch_id");
}
@Override
public String getKey() {
return map.get("key");
}
@Override
public InputStream getCertStream() {
return new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
};
}
@Override
public int getHttpConnectTimeoutMs() {
return 100000;
}
@Override
public int getHttpReadTimeoutMs() {
return 100000;
}
}
7:控制器import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.yunchao.hsh.pay.config.WXPayConfig;
import com.yunchao.hsh.pay.interfaces.IWXPayConfig;
import com.yunchao.hsh.pay.utils.WXPayUtils;
import com.yunchao.hsh.utils.superdir.sub.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
/**
* @Title: WXPayDemoController
* @Description: 微信支付demo
* @author wdz
* @date 2019/3/5 9:31
*/
@Controller
@RequestMapping("/pay")
public class WXPayDemoController {
@Autowired
IWXPayConfig wxPayConfig;
@RequestMapping(value = "/creater",method = RequestMethod.GET)
@ResponseBody
public Result pay(String openid, String notifyUrl, String outTradeNo, String totalFee, String body){
Result result = new Result();
// 用於生成簽名,key必須與微信官網提供的一致,否則不能識別
Map<String, String> sendMap = new HashMap<>();
// 返回給前端
SortedMap<String, String> map = WXPayConfig.getWXPayConfig();
String key = map.get("key");
String mch_id = map.get("mch_id");
String spbill_create_ip = map.get("spbill_create_ip");
String trade_type = map.get("trade_type");
String appid = map.get("appid");
try {
sendMap.put("appid",appid);
sendMap.put("openid",openid);
sendMap.put("mch_id",mch_id);
sendMap.put("nonce_str", WXPayUtils.getRandomStr(32));
sendMap.put("body",body);
sendMap.put("out_trade_no",outTradeNo);
sendMap.put("total_fee",totalFee);
sendMap.put("notify_url",notifyUrl);
sendMap.put("spbill_create_ip",spbill_create_ip);
sendMap.put("trade_type",trade_type);
map.put("appid",appid);
map.put("openid",openid);
map.put("notify_url",notifyUrl);
map.put("out_trade_no",outTradeNo);
map.put("total_fee",totalFee);
map.put("body",body);
// 調用微信工具獲取簽名
String sign = WXPayUtil.generateSignature(sendMap,key);
map.put("sign",sign);
sendMap.put("sign",sign);
// 獲取xml格式數據
String xmlStr = WXPayUtil.generateSignedXml(sendMap, key);
map.put("xml",xmlStr);
// 調用微信提供的支付,接口繼承及實現就是爲了這一步
WXPay pay = new WXPay(wxPayConfig);
// 調用統一支付
Map<String, String> resultMap = pay.unifiedOrder(sendMap);
// 判斷是否成功,如果失敗該map中會返回相關信息
if(resultMap.get("return_code").equals("SUCCESS")){
String prepay_id = resultMap.get("prepay_id");
sendMap.put("prepay_id","prepay_id="+prepay_id);
map.put("prepay_id","prepay_id="+prepay_id);
}
} catch (Exception e) {
e.printStackTrace();
}
result.setS("",map);
System.out.println(map.toString());
return result;
}
}
小程序調用支付成功,以上純屬個人理解,還有好多配置沒搞懂,繼續研究,如有錯誤歡迎指正