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


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

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

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

  • 相关阅读:
    springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理
    springboot集成mybatis,热部署以及整合Swagger2
    使用idea上传项目到码云(gitee)上
    RabbitMQ 高级应用
    Spring Boot整合RabbitMQ
    RabbitMQ--其他几种模式
    RabbitMQ入门--简单模式
    RabbitMQ安装(centos7)
    RocketMQ安装及入门
    [UWP]涨姿势UWP源码——极简的RSS阅读器
  • 原文地址:https://www.cnblogs.com/wyrlzy/p/12624577.html
Copyright © 2020-2023  润新知