微信支付分(二)--------小程序授權教程以及所遇到的坑


前言:最近正在做一個微信支付分的項目,其中遇到了很多問題,網上也沒有很好的回答,所以比較頭疼,自己寫一下做微信經驗,希望對廣大的朋友有所幫助。

在做微信支付分之前請先仔細閱讀以下文檔:

https://developers.weixin.qq.com/miniprogram/dev/framework/

1.創建wx-app

 

 

 

 

 

 

 

 

 

 

 前端小程序授權代碼最好使用官方文檔提供的實例代碼(微信客服建議)

項目目錄以及主要代碼,具體的不詳細的貼出,畢竟不是主要的,網上一搜一大把,主要解決可能會出現的問題

2.創建后台

 

  /**
     * 獲取微信支付分簽名
     *
     * @param params
     * @return
     * @throws Exception
     */
    @RequestMapping("/generateSignature.do")
    public Map<String, String> generateSignature(@RequestBody Map<String, String> params) throws Exception {
        HashMap<String, String> stringStringHashMap = new HashMap<String, String>();
        stringStringHashMap.put("mch_id", "xxxx");//自己的商戶號
        stringStringHashMap.put("service_id", "xxxx");//自己服務id
        stringStringHashMap.put("out_request_no", Signature.create_nonce_strs());//商戶服務訂單號(隨機)
        stringStringHashMap.put("timestamp", Signature.create_timestamp());//時間戳
        stringStringHashMap.put("nonce_str", Signature.create_nonce_str());//隨機字符串
        stringStringHashMap.put("sign_type", "HMAC-SHA256");//簽名方式
        String signature = WeChatUtils.generateSignature(stringStringHashMap, "自己key", WeChatConstant.SignType.HMACSHA256);
        stringStringHashMap.put("sign", signature);
        LOGGER.info("=====================================微信支付分簽名"+stringStringHashMap);
        return stringStringHashMap;
    }

 

  

 public static String create_nonce_str() {
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        for (int i = 0; i < 32; i++) {
            sb.append(STR_ARR[rand.nextInt(STR_ARR.length)]);
        }
        return sb.toString();
       // return "Wm3WZYTPz0wzccnW";
    }

    public static String create_nonce_strs() {
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        for (int i = 0; i < 20; i++) {
            sb.append(STR_ARR[rand.nextInt(STR_ARR.length)]);
        }
        return sb.toString();
        // return "Wm3WZYTPz0wzccnW";
    }

    public static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
        //return "1414587457";
    }

  

  /**
     * 生成簽名
     *
     * @param data
     * @param key
     * @return
     * @throws Exception 規則
     *                   第一步,設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
     *                   <p>
     *                   特別注意以下重要規則:
     *                   <p>
     *                   ◆ 參數名ASCII碼從小到大排序(字典序);
     *                   ◆ 如果參數的值為空不參與簽名;
     *                   ◆ 參數名區分大小寫;
     *                   ◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名,將生成的簽名與該sign值作校驗。
     *                   ◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
     *                   <p>
     *                   第二步,在stringA最后拼接上key得到stringSignTemp字符串,並對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue。
     */
    public static String generateSignature(final Map<String, String> data, String key, SignType signType) throws Exception {

        Set<String> keySet = data.keySet();
        String[] keyArray = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(keyArray);
        StringBuilder sb = new StringBuilder();
        for (String k : keyArray) {
            if (k.equals(WeChatConstant.FIELD_SIGN)) {
                continue;
            }
            if (data.get(k).trim().length() > 0) // 參數值為空,則不參與簽名
                sb.append(k).append("=").append(data.get(k).trim()).append("&");
        }
        sb.append("key=").append(key);

        if (SignType.MD5.equals(signType)) {
            return MD5(sb.toString()).toUpperCase();
        } else if (SignType.HMACSHA256.equals(signType)) {
            System.out.println("HMACSHA256 original text: " + sb.toString());
            return HMACSHA256(sb.toString(), key);
        } else {
            throw new Exception(String.format("Invalid sign_type: %s", signType));
        }
    }

  

public class WeChatConstant {

    public enum SignType {
        MD5, HMACSHA256
    }

    public static final String FIELD_SIGN = "sign";
    public static final String FIELD_SIGN_TYPE = "sign_type";

}

3、用戶授權/解除授權完成后回調

具體的代碼就不貼了,無非就是在后台發送請求並接受返回的參數,在這里就說一下可能遇到的問題。

當你授權以后,正常在設置service_notify_url的情況下,就會很快回調你設置的此路徑,並返回數據,沒有回調你檢查一下是否設置了(用商戶平台上設置的APIv3密鑰【微信商戶平台—>賬戶設置—>API安全—>設置APIv3密鑰】,記為key。)

 

 

----------------------------------下一篇寫用戶授權/解除授權完成后回調具體代碼!!!!!!

 

 

4.遇到的問題解答: 

 

 

 開發過過程中碰到這樣的一個問題,大概解決了一個禮拜都沒解決,上篇提到配置好appid等參數,后來我們發現是因為其中的參數沒有配置好,導致的問題,如果你們發現代碼沒問題,就要仔細的檢查,和詳細閱讀關於配置

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM