微信分享签名Java代码实现

最近写了一个小微信签名功能,记录一下希望用到的朋友可以参考下。

/**
 * Created by mazhq on 2018/6/26
 */
@RestController
@RequestMapping("/api/wx")
public class WeixinAction {
    private static final Logger logger = LoggerFactory.getLogger(WeixinAction.class);
    private static final String appId = "appId";
    private static final String secret = "secret";
    @Autowired
    RestTemplate restTemplate;

    @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("获取签名URL: "+newUrl);
        String[] signArr = new String[]{"url=" + newUrl, "jsapi_ticket=" + getWXJsapiTicket(), "noncestr=" + nonceStr, "timestamp=" + timestamp};
        Arrays.sort(signArr);
        String signStr = StringUtils.join(signArr, "&");
        JSONObject respJson = new JSONObject();
        String resSign = DigestUtils.sha1Hex(signStr);
        logger.info("返回的签名:"+resSign);
        respJson.put("appId", appId);
        respJson.put("timestamp", timestamp);
        respJson.put("nonceStr", nonceStr);
        respJson.put("signature", resSign);
        JsonObject jsonObject = BaseCode.retCode(ResultCode.success);
        jsonObject.putValue("resp", respJson);
        return jsonObject.toString();
    }

    private String getWXJsapiTicket() {
        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"));
        return resJson.getString("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");
    }


    private 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();
    }

  

猜你喜欢

转载自www.cnblogs.com/owenma/p/9240301.html