微信分享簽名Java代碼實現


最近寫了一個小微信簽名功能,記錄一下希望用到的朋友可以參考下。

 

RestController
@RequestMapping("/api/wx")
public class WeixinAction {
    private static final Logger logger = LoggerFactory.getLogger(WeixinAction.class);
    private static final String appId = "appId";
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    RedisClient redisClient;

    @RequestMapping("/WeixinAction_getWXConfigSignature")
    public String getWXConfigSignature(@RequestBody JSONObject reqJson) {
        String url = reqJson.getString("url");
        logger.info("原始URL: " + url);
        long timeStampSec = System.currentTimeMillis() / 1000;
        String timestamp = String.format("%010d", timeStampSec);
        String nonceStr = getRandomStr(8);
        String[] urls = url.split("#");
        String newUrl = urls[0];
        logger.info("隨機串:"+nonceStr+", 獲取簽名URL: " + newUrl);
        JSONObject respJson = new JSONObject();
        String[] signArr = new String[]{"url=" + newUrl, "jsapi_ticket=" + getWXJsapiTicket(), "noncestr=" + nonceStr, "timestamp=" + timestamp};
        Arrays.sort(signArr);
        String signStr = StringUtils.join(signArr, "&");
        String resSign = DigestUtils.sha1Hex(signStr);

        logger.info("返回的簽名:" + resSign);
        respJson.put("appId", appId);
        respJson.put("timestamp", timestamp);
        respJson.put("nonceStr", nonceStr);
        respJson.put("signature", resSign);
        logger.info(respJson.toJSONString());
        JsonObject jsonObject = BaseCode.retCode(ResultCode.success);
        jsonObject.putValue("resp", respJson);
        return jsonObject.toString();
    }

    private String getWXJsapiTicket() {
        String ticket = redisClient.getStr(appId);
        if (StringUtils.isBlank(ticket)) {
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + getWXaccessToken() + "&type=jsapi";
            String resp = restTemplate.getForObject(url, String.class);
            JSONObject resJson = JSONObject.parseObject(resp);
            logger.info("獲取到ticket:" + resJson.getString("ticket"));
            redisClient.setStr(appId, resJson.getString("ticket"), SystemConstants.ONE_HOURS * 2);
            return resJson.getString("ticket");
        }
        return ticket;
    }

    private String getWXaccessToken() {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret=secret";
        String resp = restTemplate.getForObject(url, String.class);
        JSONObject resJson = JSONObject.parseObject(resp);
        logger.info("獲取到access_token:" + resJson.getString("access_token"));
        return resJson.getString("access_token");
    }


    public static String getRandomStr(int length) {
        String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        int randomNum;
        char randomChar;
        Random random = new Random();
        // StringBuffer類型的可以append增加字符
        StringBuffer str = new StringBuffer();

        for (int i = 0; i < length; i++) {
            // 可生成[0,n)之間的整數,獲得隨機位置
            randomNum = random.nextInt(base.length());
            // 獲得隨機位置對應的字符
            randomChar = base.charAt(randomNum);
            // 組成一個隨機字符串
            str.append(randomChar);
        }
        return str.toString();
    }
}

  


免責聲明!

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



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