1. 程式人生 > >Java開發SSM框架微信支付

Java開發SSM框架微信支付

etc ray 企業 展示 system 都在 pes generator 程序開發

微信小程序的Java支付開發一直是一塊坑,網上的教程也是琳瑯滿目。筆者六月的時候接觸到了微信的小程序開發摸到了微信支付方面的東西,騰訊的官方文檔也是一言難盡很多地方看不懂,而且官方也沒有提供Java的示範導致Java做微信支付不得不自己踩坑。現在我把自己微信支付開發的步驟和代碼都在下面展示出來,希望有沒有做出來的朋友不要心急跟著我的步驟走就沒問題。

第一步:首先微信支付的話只能是企業的開發賬戶才能使用的如果你是個人開發者是無法開通微信支付的。我們首先拿到賬號,然後拿到微信支付相關的商戶號和商戶支付密鑰,這些東西公司都會提供。有了這些以後就可以進行開發了。

public class Configure {
    //商戶支付密鑰
    private static String key = "****************************";
    //小程序ID
    private static String appID = "***************";
    //商戶號
    private static String mch_id = "*********";
    //小程序密鑰
    private static String secret = "********************";

我把開發者賬號和商戶號都放在了一個工具類方便在後面的調用。

第二步:做支付要先獲取到用戶的openid這是一個很重要的參數你必須要拿到的東西不然就無法完成支付。下面是我獲取用戶的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");
                //設置請求器的配置
        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之後我們就要進行下單。簡單來說要把微信支付所需要的參數都準備好然後給到官方提供的api。這些東西在官方的文檔裏面各位可以去查閱。下面是我傳遞參數的代碼:

            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");

可以看到上面的傳遞的參數中有需要支付的金額、和隨機生成的32位商戶訂單號、以及開發者的appid和支付說明支付的ip地址這些參數我們想辦法都拿到之後是否就能丟給官方api呢?當然還不是,往下看第四步。

第四步:我們拿到了參數之後能否直接給到api呢?微信支付出於安全考慮參數需要進行加密之後發送給微信支付api。我們得把剛剛拿到的參數進行簽名加密,我這裏用到的是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("簽名數據:"+result);
        result = MD5Util.MD5Encode(result,"utf-8").toUpperCase();
        return result;
    }

到這一步就已經支付完成了。
技術分享圖片
技術分享圖片
通過官方api返回的回調類型來判斷支付是否成功。

只要大家按照步驟來就可以實現,有任何的問題歡迎在評論區指出。

Java開發SSM框架微信支付