All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.riversoft.weixin.mp.jsapi.JsAPIs Maven / Gradle / Ivy

The newest version!
package com.riversoft.weixin.mp.jsapi;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.riversoft.weixin.common.WxClient;
import com.riversoft.weixin.common.decrypt.AesException;
import com.riversoft.weixin.common.decrypt.SHA1;
import com.riversoft.weixin.common.exception.WxRuntimeException;
import com.riversoft.weixin.common.jsapi.JsAPISignature;
import com.riversoft.weixin.common.jsapi.WxCardAPISignature;
import com.riversoft.weixin.common.util.JsonMapper;
import com.riversoft.weixin.common.util.RandomStringGenerator;
import com.riversoft.weixin.mp.MpWxClientFactory;
import com.riversoft.weixin.mp.base.AppSetting;
import com.riversoft.weixin.mp.base.WxEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 微信JSAPI
 * Created by exizhai on 1/27/2016.
 */
public class JsAPIs {

    private static Logger logger = LoggerFactory.getLogger(JsAPIs.class);

    private APITicket jsAPITicket;
    private APITicket wxCardAPITicket;

    private WxClient wxClient;

    public static JsAPIs defaultJsAPIs() {
        return with(AppSetting.defaultSettings());
    }

    public static JsAPIs with(AppSetting appSetting) {
        JsAPIs jsAPIs = new JsAPIs();
        jsAPIs.setWxClient(MpWxClientFactory.getInstance().with(appSetting));
        return jsAPIs;
    }

    public void setWxClient(WxClient wxClient) {
        this.wxClient = wxClient;
    }

    private synchronized void getJsAPITicket(){
        if(jsAPITicket == null || jsAPITicket.expired()) {//double check
            String url = WxEndpoint.get("url.jsapi.ticket.get");
            String response = wxClient.get(url);
            this.jsAPITicket = APITicket.fromJson(response);
        }
    }


    private synchronized void getWxCardAPITicket(){
        if(wxCardAPITicket == null || wxCardAPITicket.expired()) {//double check
            String url = WxEndpoint.get("url.wxcard.jsapi.ticket.get");
            String response = wxClient.get(url);
            this.wxCardAPITicket = APITicket.fromJson(response);
        }
    }

    /**
     * 创建JsAPI签名
     * @param url
     * @return
     */
    public JsAPISignature createJsAPISignature(String url){
        if(jsAPITicket == null || jsAPITicket.expired()) {
            getJsAPITicket();
        }

        long timestamp = System.currentTimeMillis() / 1000;
        String nonce = RandomStringGenerator.getRandomStringByLength(16);
        String ticket = jsAPITicket.getTicket();

        try {
            String signature = SHA1.getSHA1("jsapi_ticket=" + ticket + "&noncestr=" + nonce + "×tamp=" + timestamp + "&url=" + url);

            JsAPISignature jsAPISignature = new JsAPISignature();
            jsAPISignature.setAppId(wxClient.getClientId());
            jsAPISignature.setNonce(nonce);
            jsAPISignature.setTimestamp(timestamp);
            jsAPISignature.setSignature(signature);
            jsAPISignature.setUrl(url);
            return jsAPISignature;
        } catch (AesException e) {
            logger.error("createJsAPISignature failed", e);
            throw new WxRuntimeException(999, e.getMessage());
        }
    }

    /**
     * 创建微信卡券JSAPI签名
     * @param wxCardAPISignature
     * @return
     */
    public WxCardAPISignature createWxCardJsAPISignature(WxCardAPISignature wxCardAPISignature){
        if(wxCardAPITicket == null || wxCardAPITicket.expired()) {
            getWxCardAPITicket();
        }

        long timestamp = System.currentTimeMillis() / 1000;
        String nonce = RandomStringGenerator.getRandomStringByLength(16);
        String ticket = wxCardAPITicket.getTicket();

        List parameters = new ArrayList<>();
        if(wxCardAPISignature.isChooseCard()) {
            parameters.add(wxClient.getClientId());
        }

        parameters.add(ticket);
        parameters.add(wxCardAPISignature.getCardId());
        parameters.add(nonce);
        parameters.add(String.valueOf(timestamp));

        if(!(wxCardAPISignature.getCardType() == null || "".equals(wxCardAPISignature.getCardType()))) {
            parameters.add(wxCardAPISignature.getCardType());
        }
        if(!(wxCardAPISignature.getCode() == null || "".equals(wxCardAPISignature.getCode()))) {
            parameters.add(wxCardAPISignature.getCode());
        }
        if(!(wxCardAPISignature.getBalance() == null || "".equals(wxCardAPISignature.getBalance()))) {
            parameters.add(wxCardAPISignature.getBalance());
        }
        if(!(wxCardAPISignature.getOpenId() == null || "".equals(wxCardAPISignature.getOpenId()))) {
            parameters.add(wxCardAPISignature.getOpenId());
        }
        if(!(wxCardAPISignature.getLocationId() == null || "".equals(wxCardAPISignature.getLocationId()))) {
            parameters.add(wxCardAPISignature.getLocationId());
        }

        try {
            String signature = SHA1.getSHA1((String[])parameters.toArray());

            wxCardAPISignature.setNonce(nonce);
            wxCardAPISignature.setTimestamp(timestamp);
            wxCardAPISignature.setSignature(signature);
            return wxCardAPISignature;
        } catch (AesException e) {
            logger.error("createWxCardJsAPISignature failed", e);
            throw new WxRuntimeException(999, e.getMessage());
        }
    }

    public static class APITicket {

        private String ticket;

        @JsonProperty("expires_in")
        private long expiresIn;

        private long expiresTill;

        public static APITicket fromJson(String json) {
            return JsonMapper.defaultMapper().fromJson(json, APITicket.class);
        }

        public String getTicket() {
            return ticket;
        }

        public void setTicket(String ticket) {
            this.ticket = ticket;
        }

        public long getExpiresIn() {
            return expiresIn;
        }

        public void setExpiresIn(long expiresIn) {
            this.expiresIn = expiresIn;
            this.expiresTill = System.currentTimeMillis() + (expiresIn * 1000) - 60000;
        }

        public long getExpiresTill() {
            return expiresTill;
        }

        public boolean expired() {
            return System.currentTimeMillis() > expiresTill;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy