tnblog
首页
视频
资源
登录

.NET接入微信支付(二)注入JSDKconfig

6020人阅读 2023/2/23 16:55 总访问:29133 评论:0 收藏:2 手机
分类: 微信支付
/// <summary>
/// JSApi 调用类
/// </summary>
public class WxPayJsApi {
    //获取 调起支付 API参数 
    public string GetJsApiParameters(string prepay_id) {
        WcPayChooseRequest request = new WcPayChooseRequest(
            WxPayConfig.APPID,
            WxPayUitls.GenerateTimeStampString(),
            WxPayUitls.GenerateNonceStr(),
            "prepay_id=" + prepay_id, "RSA");
        request.paySign = WxPayEncrypt.MakePaySign(request.GetMessage(request));
        string parameters = request.ToJsonStr();
        return parameters;
    }
    /// <summary>
    /// 返回 config 注入参数
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public string GetJsApiConfig(string url) {
        WxPayApiJSDK config = new WxPayApiJSDK(true,
            WxPayConfig.APPID,
            WxPayUitls.GenerateTimeStampString(),
            WxPayUitls.GenerateNonceStr(), url
        );
        //正式上线 需要添加正确api列表
        var enumValues = Enum.GetValues(typeof(WechatPayApiEnum));
        foreach(Enum value in enumValues) {
            config.JsApiList.Add(value.ToString());
        }
        string parameters = config.ToJsonToFrontStr();
        return parameters;
    }
}
/// <summary>
/// 注入 JSDK config 类
/// </summary>
public class WxPayApiJSDK {
    private bool debug;
    private string appId;
    private string timestamp;
    private string nonceStr;
    private string signature;
    private List < string > jsApiList = new List < string > ();
    private string url;
    private string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
    public WxPayApiJSDK(bool debug, string appId, string timestamp, string nonceStr, string url) {
        this.debug = debug;
        this.appId = appId;
        this.timestamp = timestamp;
        this.nonceStr = nonceStr;
        this.url = url;
        this.signature = GetConfigSignature();
    }
    /// <summary>
    /// 是否开启调试模式
    /// </summary>
    public bool Debug {
        get {
            return debug;
        }
        set {
            debug = value;
        }
    }
    /// <summary>
    /// 必填,公众号的唯一标识
    /// </summary>
    public string AppId {
        get {
            return appId;
        }
        set {
            appId = value;
        }
    }
    /// <summary>
    /// 必填,生成签名的时间戳
    /// </summary>
    public string Timestamp {
        get {
            return timestamp;
        }
        set {
            timestamp = value;
        }
    }
    /// <summary>
    /// 必填,生成签名的随机串
    /// </summary>
    public string NonceStr {
        get {
            return nonceStr;
        }
        set {
            nonceStr = value;
        }
    }
    /// <summary>
    /// 必填,签名
    /// </summary>
    public string Signature {
        get {
            return signature;
        }
        set {
            signature = value;
        }
    }
    /// <summary>
    /// 必填,需要使用的JS接口列表
    /// </summary>
    public List < string > JsApiList {
        get {
            return jsApiList;
        }
        set {
            jsApiList = value;
        }
    }
    public string Url {
        get {
            return url;
        }
        set {
            url = value;
        }
    }
    /// <summary>
    /// 生成注入config签名
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    private string GetConfigSignature() {
        Hashtable hs = new Hashtable();
        hs.Add("jsapi_ticket", Getjsapi_ticket()); //获取的
        hs.Add("noncestr", NonceStr);
        hs.Add("timestamp", Timestamp);
        hs.Add("url", Url);
        //得到string1
        string string1 = formatParameters(hs);
        //对string1进行sha1签名
        Signature = GetHashSigntrue(string1);
        return Signature;
    }
    /// <summary>
    /// 参数名ASCII码从小到大排序(字典序)
    /// </summary>
    /// <param name="parameters"></param>
    /// <returns></returns>
    private string formatParameters(Hashtable parameters) {
        StringBuilder sb = new StringBuilder();
        ArrayList akeys = new ArrayList(parameters.Keys);
        akeys.Sort();
        foreach(string k in akeys) {
            string v = (string) parameters[k]; //防止参数不是字符串
            sb.Append(k.ToLower() + "=" + v + "&");
        }
        //去掉最后一个&
        if (sb.Length > 0) {
            sb.Remove(sb.Length - 1, 1);
        }
        return sb.ToString();
    }
    /// <summary>
    /// 进行sha1签名
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string HashCode(string str) {
        string rethash = "";
        try {
            SHA1 hash = SHA1.Create();
            rethash = Convert.ToBase64String(hash.ComputeHash(Encoding.UTF8.GetBytes(str)));
        } catch (Exception ex) {
            string strerr = "Error in HashCode : " + ex.Message;
        }
        return rethash;
    }
    public string GetHashSigntrue(string str) {
        var sha1 = new SHA1Managed();
        var sha1bytes = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(str);
        byte[] resultHash = sha1.ComputeHash(sha1bytes);
        string sha1String = BitConverter.ToString(resultHash).ToLower();
        sha1String = sha1String.Replace("-", "");
        return sha1String;
    }
    public string GetAccess_Token(WxPayConfig payConfig) {
        var cache = CacheHelper.Instance;
        string access_token = string.Empty;
        if (cache.GetValue(WxPayCacheKeys.JSAPI_TICKET) == null) {
            string AppID = payConfig.AppID;
            string AppSecret = payConfig.AppSecret;
            string url = string.Format(tokenUrl, AppID, AppSecret);
            System.Net.WebRequest wrq = System.Net.WebRequest.Create(url);
            wrq.Method = "GET";
            System.Net.WebResponse wrp = wrq.GetResponse();
            System.IO.StreamReader sr = new System.IO.StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
            string strResult = sr.ReadToEnd();
            JObject pairs = JObject.Parse(strResult);
            access_token = pairs["access_token"].ToString();
        } else access_token = cache.GetValue(WxPayCacheKeys.ACCESS_TOKEN).ToString();
        return access_token;
    }
    public string Getjsapi_ticket(WxPayConfig payConfig) {
        var cache = CacheHelper.Instance;
        string Jsapi_ticket = string.Empty;
        string access_token = string.Empty;
        string accessToken = payConfig.AppID + WxPayCacheKeys.ACCESS_TOKEN;
        string jsapiTicket = payConfig.AppID + WxPayCacheKeys.JSAPI_TICKET;
        if (cache.GetValue(jsapiTicket) == null) {
            string url = string.Empty;
            string strResult = string.Empty;
            System.Net.WebRequest wrq = null;
            System.Net.WebResponse wrp = null;
            System.IO.StreamReader sr = null;
            JObject pairs = null;
            if (cache.GetValue(accessToken) == null) {
                string AppID = payConfig.AppID;
                string AppSecret = payConfig.AppSecret;
                url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppID, AppSecret);
                wrq = System.Net.WebRequest.Create(url);
                wrq.Method = "GET";
                wrp = wrq.GetResponse();
                sr = new System.IO.StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
                strResult = sr.ReadToEnd();
                pairs = JObject.Parse(strResult);
                if (!strResult.Contains("access_token")) {
                    return "not in whitelist rid";
                }
                access_token = pairs["access_token"].ToString();
                sr.Close();
            } else {
                access_token = cache.GetValue(accessToken).ToString();
            }
            url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
            wrq = System.Net.WebRequest.Create(url);
            wrp = wrq.GetResponse();
            sr = new System.IO.StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
            string backStr = sr.ReadToEnd();
            //string backStr = "{ \"errcode\":0,\"errmsg\":\"ok\",\"ticket\":\"kgt8ON7yVITDhtdwci0qeZWDYY9llY5RrKsWxKD--zOUIRYqJ1XwMo305bwZhG22b5hOl-TZ-gZAXCbMMHwvCw\",\"expires_in\":7200}";
            pairs = JObject.Parse(backStr);
            var code = pairs["errcode"].ToString();
            if (code != "0") {
                return pairs["errmsg"].ToString();
            }
            Jsapi_ticket = pairs["ticket"].ToString();
            cache.InsertAndAbsoluteExp(accessToken, access_token, WxPayCacheKeys.ExpirationTime - 5);
            cache.InsertAndAbsoluteExp(jsapiTicket, Jsapi_ticket, WxPayCacheKeys.ExpirationTime - 5);
        } else Jsapi_ticket = cache.GetValue(jsapiTicket).ToString();
        return Jsapi_ticket;
    }
}


评价
一木浮沉,吾与之。
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术