Java開(kāi)發(fā)SSM框架微信支付的實(shí)現(xiàn)

微信小程序的Java支付開(kāi)發(fā)一直是一塊坑,網(wǎng)上的教程也是琳瑯滿目。筆者六月的時(shí)候接觸到了微信的小程序開(kāi)發(fā)摸到了微信支付方面的東西,騰訊的官方文檔也是一言難盡很多地方看不懂,而且官方也沒(méi)有提供Java的示范導(dǎo)致Java做微信支付不得不自己踩坑?,F(xiàn)在我把自己微信支付開(kāi)發(fā)的步驟和代碼都在下面展示出來(lái),希望有沒(méi)有做出來(lái)的朋友不要心急跟著我的步驟走就沒(méi)問(wèn)題。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到臨夏州網(wǎng)站設(shè)計(jì)與臨夏州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋臨夏州地區(qū)。

第一步:首先微信支付的話只能是企業(yè)的開(kāi)發(fā)賬戶才能使用的如果你是個(gè)人開(kāi)發(fā)者是無(wú)法開(kāi)通微信支付的。我們首先拿到賬號(hào),然后拿到微信支付相關(guān)的商戶號(hào)和商戶支付密鑰,這些東西公司都會(huì)提供。有了這些以后就可以進(jìn)行開(kāi)發(fā)了。

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

我把開(kāi)發(fā)者賬號(hào)和商戶號(hào)都放在了一個(gè)工具類(lèi)方便在后面的調(diào)用。

第二步:做支付要先獲取到用戶的openid這是一個(gè)很重要的參數(shù)你必須要拿到的東西不然就無(wú)法完成支付。下面是我獲取用戶的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è)置請(qǐng)求器的配置
    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之后我們就要進(jìn)行下單。簡(jiǎn)單來(lái)說(shuō)要把微信支付所需要的參數(shù)都準(zhǔn)備好然后給到官方提供的api。這些東西在官方的文檔里面各位可以去查閱。下面是我傳遞參數(shù)的代碼:

      String openid = request.getParameter("openid");
      int totalFee=Integer.parseInt(request.getParameter("totalFee"));//獲取支付金額
      String out_trade_no=RandomStringGenerator.getRandomStringByLength(32);//商戶訂單號(hào)
      OrderInfo order = new OrderInfo();
      order.setAppid(Configure.getAppID());
      order.setMch_id(Configure.getMch_id());
      order.setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
      order.setBody("測(cè)試");
      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ù)中有需要支付的金額、和隨機(jī)生成的32位商戶訂單號(hào)、以及開(kāi)發(fā)者的appid和支付說(shuō)明支付的ip地址這些參數(shù)我們想辦法都拿到之后是否就能丟給官方api呢?當(dāng)然還不是,往下看第四步。

第四步:我們拿到了參數(shù)之后能否直接給到api呢?微信支付出于安全考慮參數(shù)需要進(jìn)行加密之后發(fā)送給微信支付api。我們得把剛剛拿到的參數(shù)進(jìn)行簽名加密,我這里用到的是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)支付完成了。

Java開(kāi)發(fā)SSM框架微信支付的實(shí)現(xiàn)

Java開(kāi)發(fā)SSM框架微信支付的實(shí)現(xiàn)

通過(guò)官方api返回的回調(diào)類(lèi)型來(lái)判斷支付是否成功。

只要大家按照步驟來(lái)就可以實(shí)現(xiàn),以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

分享名稱:Java開(kāi)發(fā)SSM框架微信支付的實(shí)現(xiàn)
本文網(wǎng)址:http://bm7419.com/article4/pcgcoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站面包屑導(dǎo)航、網(wǎng)頁(yè)設(shè)計(jì)公司移動(dòng)網(wǎng)站建設(shè)、Google網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)