Java開發(fā)SSM框架微信支付的實現(xiàn)
微信小程序的Java支付開發(fā)一直是一塊坑,網(wǎng)上的教程也是琳瑯滿目。筆者六月的時候接觸到了微信的小程序開發(fā)摸到了微信支付方面的東西,騰訊的官方文檔也是一言難盡很多地方看不懂,而且官方也沒有提供Java的示范導(dǎo)致Java做微信支付不得不自己踩坑?,F(xiàn)在我把自己微信支付開發(fā)的步驟和代碼都在下面展示出來,希望有沒有做出來的朋友不要心急跟著我的步驟走就沒問題。
第一步:首先微信支付的話只能是企業(yè)的開發(fā)賬戶才能使用的如果你是個人開發(fā)者是無法開通微信支付的。我們首先拿到賬號,然后拿到微信支付相關(guān)的商戶號和商戶支付密鑰,這些東西公司都會提供。有了這些以后就可以進行開發(fā)了。
public class Configure {
//商戶支付密鑰
private static String key = "****************************";
//小程序ID
private static String appID = "***************";
//商戶號
private static String mch_id = "*********";
//小程序密鑰
private static String secret = "********************";
我把開發(fā)者賬號和商戶號都放在了一個工具類方便在后面的調(diào)用。
第二步:做支付要先獲取到用戶的openid這是一個很重要的參數(shù)你必須要拿到的東西不然就無法完成支付。下面是我獲取用戶的openid的代碼。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code = request.getParameter("code");
HttpGet httpGet = new HttpGet("https://api.weixin.qq.com/sns/jscode2session?appid="+Configure.getAppID()+"&secret="+Configure.getSecret()+"&js_code="+code+"&grant_type=authorization_code");
//設(shè)置請求器的配置
HttpClient httpClient = HttpClients.createDefault();
HttpResponse res = httpClient.execute(httpGet);
HttpEntity entity = res.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
response.getWriter().append(result);
}
第三步:獲取到用戶的openid之后我們就要進行下單。簡單來說要把微信支付所需要的參數(shù)都準備好然后給到官方提供的api。這些東西在官方的文檔里面各位可以去查閱。下面是我傳遞參數(shù)的代碼:
String openid = request.getParameter("openid");
int totalFee=Integer.parseInt(request.getParameter("totalFee"));//獲取支付金額
String out_trade_no=RandomStringGenerator.getRandomStringByLength(32);//商戶訂單號
OrderInfo order = new OrderInfo();
order.setAppid(Configure.getAppID());
order.setMch_id(Configure.getMch_id());
order.setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
order.setBody("測試");
order.setOut_trade_no(out_trade_no);
order.setTotal_fee(totalFee);
order.setSpbill_create_ip("***.***.***.**");
order.setNotify_url("https://www.see-source.com/weixinpay/PayResult");
order.setTrade_type("JSAPI");
order.setOpenid(openid);
order.setSign_type("MD5");
可以看到上面的傳遞的參數(shù)中有需要支付的金額、和隨機生成的32位商戶訂單號、以及開發(fā)者的appid和支付說明支付的ip地址這些參數(shù)我們想辦法都拿到之后是否就能丟給官方api呢?當然還不是,往下看第四步。
第四步:我們拿到了參數(shù)之后能否直接給到api呢?微信支付出于安全考慮參數(shù)需要進行加密之后發(fā)送給微信支付api。我們得把剛剛拿到的參數(shù)進行簽名加密,我這里用到的是MD5的加密方式,代碼如下:
try {
String repay_id = request.getParameter("repay_id");
SignInfo signInfo = new SignInfo();
signInfo.setAppId(Configure.getAppID());
long time = System.currentTimeMillis()/1000;
signInfo.setTimeStamp(String.valueOf(time));
signInfo.setNonceStr(RandomStringGenerator.getRandomStringByLength(32));
signInfo.setRepay_id("prepay_id="+repay_id);
signInfo.setSignType("MD5");
//生成簽名
String sign = Signature.getSign(signInfo);
JSONObject json = new JSONObject();
json.put("timeStamp", signInfo.getTimeStamp());
json.put("nonceStr", signInfo.getNonceStr());
json.put("package", signInfo.getRepay_id());
json.put("signType", signInfo.getSignType());
json.put("paySign", sign);
L.info("-------再簽名:"+json.toJSONString());
response.getWriter().append(json.toJSONString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
L.error("-------", e);
}
public static String getSign(Object o) throws IllegalAccessException {
ArrayList<String> list = new ArrayList<String>();
@SuppressWarnings("rawtypes")
Class cls = o.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
if (f.get(o) != null && f.get(o) != "") {
String name = f.getName();
XStreamAlias anno = f.getAnnotation(XStreamAlias.class);
if(anno != null)
name = anno.value();
list.add(name + "=" + f.get(o) + "&");
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
}
String result = sb.toString();
result += "key=" + Configure.getKey();
System.out.println("簽名數(shù)據(jù):"+result);
result = MD5Util.MD5Encode(result,"utf-8").toUpperCase();
return result;
}
到這一步就已經(jīng)支付完成了。


通過官方api返回的回調(diào)類型來判斷支付是否成功。
只要大家按照步驟來就可以實現(xiàn),以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何使用intellij IDEA搭建Spring Boot項目
這篇文章主要介紹了如何使用intellij IDEA搭建Spring Boot項目,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
Windows下將JAVA?jar注冊成windows服務(wù)的方法
這篇文章主要介紹了Windows下將JAVA?jar注冊成windows服務(wù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
Java ArrayList集合詳解(Java動態(tài)數(shù)組)
這篇文章主要介紹了Java ArrayList集合詳解(Java動態(tài)數(shù)組),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例
這篇文章主要介紹了Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例,本文直接給出代碼實例和效果截圖,需要的朋友可以參考下2014-10-10
Struts2學(xué)習(xí)筆記(9)-Result配置全局結(jié)果集
這篇文章主要介紹Struts2中使用Result配置全局結(jié)果集的方法,希望能給大家做一個參考。2016-06-06

