zoukankan      html  css  js  c++  java
  • 微信支付分(二)--------小程序授权教程以及所遇到的坑

    前言:最近正在做一个微信支付分的项目,其中遇到了很多问题,网上也没有很好的回答,所以比较头疼,自己写一下做微信经验,希望对广大的朋友有所帮助。

    在做微信支付分之前请先仔细阅读以下文档:

    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等参数,后来我们发现是因为其中的参数没有配置好,导致的问题,如果你们发现代码没问题,就要仔细的检查,和详细阅读关于配置

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/wyrlzy/p/12624577.html
Copyright © 2011-2022 走看看