////// 获取微信SDK配置 /// [HttpPost] [Route("api/Training/GetWxSdkConfig")] public ResponseMessage GetWxSdkConfig(ReqGetWXsdkConfig req) { var result = new ResponseMessage { Msg = false, Message = CommonMessage.GetFailure, ResultCode = (int)EnumsHelper.MessageResultCode.OpraterError, }; //获取微信支付信息 var weChatModel = MyShoppingCartService.GetMSiteWeChatPayAccount(); if (weChatModel == null) { result.Msg = false; result.Message = string.Empty; result.ResultCode = (int)EnumsHelper.MessageResultCode.OpraterError; return result; } //修改微信配置信息 SetWxJsApiConfig(weChatModel); try { var model = GenerateJsSdkConfig(req.Url); result.Info = model; result.Msg = true; result.Message = CommonMessage.GetSuccess; result.ResultCode = (int)EnumsHelper.MessageResultCode.OpraterSuccess; return result; } catch (Exception ex) { result.Info = string.Format("获取config出现异常:{0}", ex.Message.Replace("'", "\"")); return result; } } ////// 修改微信配置信息 /// private void SetWxJsApiConfig(T_MSiteWeChatPayAccount weChatModel) { WxPayConfig.APPID = weChatModel.AppId; WxPayConfig.MCHID = weChatModel.MchId; WxPayConfig.KEY = weChatModel.Key; WxPayConfig.APPSECRET = weChatModel.AppSecret; WxPayConfig.NOTIFY_URL = weChatModel.NotifyUrl; } ////// 生成SDKConfig(前端调用微信接口用) /// /// 当前页面的url ///前端所需SDKConfig信息 private JsApiConfig GenerateJsSdkConfig(string url) { var wxJsSdkApi = new WxJsSdkApi(); JsApiConfig config = new JsApiConfig() { //debug = false, appId = WxPayConfig.APPID, nonceStr = wxJsSdkApi.NonceStr, timestamp = wxJsSdkApi.TimeStamp, //signature = signature 需要使用的JS接口列表 //jsApiList = new string[] { "chooseImage", "previewImage", "uploadImage", "downloadImage" } }; //签名 string signature = wxJsSdkApi.MakeSha1Sign(config.nonceStr,config.timestamp,url); config.signature = signature; return config; }
账号基本配置信息
/** * 配置账号信息 */ public class WxPayConfig { //=======【基本信息设置】===================================== /* 微信公众号信息配置 * APPID:绑定支付的APPID(必须配置) * MCHID:商户号(必须配置) * KEY:商户支付密钥,参考开户邮件设置(必须配置) * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置) */ //public static string APPID = "xxxxxxxxxxxxxx"; public static string APPID = "xxxxxxxxxxx"; public static string MCHID = "xxxxxxxxxxx"; public static string KEY = "xxxxxxxxxxx"; public static string APPSECRET = "xxxxxxxxxxxxxx"; //=======【证书路径设置】===================================== /* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要) */ public static string SSLCERT_PATH = "cert/apiclient_cert.p12"; public static string SSLCERT_PASSWORD = "1233410002"; //=======【支付结果通知url】===================================== /* 支付结果通知回调url,用于商户接收支付结果 */ public static string NOTIFY_URL = "http://xxxxxx.com/payNotify"; //=======【商户系统后台机器IP】===================================== /* 此参数可手动配置也可在程序中自动获取 */ public static string IP = "8.8.8.8"; //=======【代理服务器设置】=================================== /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置) */ //public static string PROXY_URL = "http://0.0.0.0:0"; public static string PROXY_URL = "http://0.0.0.0:0"; //=======【上报信息配置】=================================== /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报 */ public static int REPORT_LEVENL = 1; //=======【日志级别】=================================== /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息 */ public static int LOG_LEVENL = 3; }
SDK生成签名
public class WxJsSdkApi { ////// 缓存 /// private RedisInfoHelper redis => new RedisInfoHelper(); ////// 微信appid /// private string appId = WxPayConfig.APPID; ////// 微信appsecret /// private string secret = WxPayConfig.APPSECRET; ////// 获取基础支持access_token url 每日调用上限2000次 /// 详情参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 /// private string WxGetTokenUrl = "https://api.weixin.qq.com/cgi-bin/token"; private string WxGetTokenParam = "grant_type=client_credential&appid={0}&secret={1}"; ////// 获取jsapi_ticket url /// 详情参考:https://qydev.weixin.qq.com/wiki/index.php?title=%E5%BE%AE%E4%BF%A1JS-SDK%E6%8E%A5%E5%8F%A3 /// private string WxGetTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket"; private string WxGetTicketParam = "access_token={0}&type=jsapi"; ////// 加密字符串的拼接 /// private string WxSha1SignStr = "jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}"; ////// 通过用户code获取网页授权access_token url /// 详情参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 /// private string WxGetAccessTokenByCodeUrl = "https://api.weixin.qq.com/sns/oauth2/access_token"; private string WxGetAccessTokenByCodeParam = "appid={0}&secret={1}&code={2}&grant_type=authorization_code"; ////// 基础支持Access_Token 有效期7200秒 /// public string BaseAccessToken => GetBaseAccessToken(); ////// Ticket 公众号用于调用微信JS接口的临时票据 (有效期7200秒) /// public string Ticket { get { return GetTicket(); } } ////// 生成签名的随机串 /// public string NonceStr { get; set; } = Guid.NewGuid().ToString().Replace("-", ""); ////// 生成签名的时间戳 /// public string TimeStamp { get { TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString(); } } ////// 获取基础支持access_token /// private string GetBaseAccessToken() { var accesstoken = redis.GetAccessTokenByAppId("wx_" + appId); if ((string.Empty).Equals(accesstoken)) { return GetBaseToken(); } return accesstoken != null ? accesstoken.ToString() : GetBaseToken(); } ////// 获取基础支持access_token /// private string GetBaseToken() { try { string token = string.Empty; //向微信发送请求获取 基础支持accessToken string content = HttpClientHelper.HttpGet(WxGetTokenUrl, string.Format(WxGetTokenParam, appId, secret)); Log4NetHelp.Debug($"微信JSSDK获取基础accessToken参数--appid:{content},secret:{secret}"); Log4NetHelp.Debug($"微信JSSDK获取基础accessToken返回结果--{content}"); if (!string.IsNullOrEmpty(content)) { var obj = JsonConvert.DeserializeObject(content); if (!obj.errcode.HasValue) { token = obj.access_token; //缓存 access_token redis.SetRedis("wx_" + appId, token, DateTime.Now.AddSeconds(7200)); //获取 ticket GetTicket(token); } } return token; } catch (Exception ex) { return ex.Message; } } /// /// 获取ticket /// private string GetTicket(string accessToken = "") { var ticket = string.Empty; accessToken = BaseAccessToken; if (string.Empty.Equals(accessToken)) return ticket; ticket = redis.GetTicketByAccessToken(accessToken); if ((string.Empty).Equals(ticket)) { string content = HttpClientHelper.HttpGet(WxGetTicketUrl, string.Format(WxGetTicketParam, accessToken)); Log4NetHelp.Debug($"微信JSSDK获取ticket参数--accessToken:{accessToken}"); Log4NetHelp.Debug($"微信JSSDK获取ticket返回结果--{content}"); JsApiTicket obj = JsonConvert.DeserializeObject(content); ticket = obj.ticket; redis.SetRedis(accessToken, ticket, DateTime.Now.AddSeconds(7200)); } return ticket; } /// /// SDK生成签名 (SHA1加密) /// 注意:需要引用System.Security.dll /// /// 当前页面链接 public string MakeSha1Sign(string nonceStr, string timeStamp, string url) { string str = string.Format(WxSha1SignStr, Ticket, nonceStr, timeStamp, url); Log4NetHelp.Info($"SDK生成签名加密字符串--{str}"); byte[] StrRes = Encoding.Default.GetBytes(str); HashAlgorithm iSHA = new SHA1CryptoServiceProvider(); StrRes = iSHA.ComputeHash(StrRes); StringBuilder EnText = new StringBuilder(); foreach (byte iByte in StrRes) { EnText.AppendFormat("{0:x2}", iByte); } return EnText.ToString(); } ////// 通过code换取网页授权access_token /// /// ///public TokenResultInfo GetAccessTokenByCode(string code) { var result = new TokenResultInfo(); //向微信发送请求获取 网页授权accessToken string content = HttpClientHelper.HttpGet(WxGetAccessTokenByCodeUrl, string.Format(WxGetAccessTokenByCodeParam, appId, secret, code)); Log4NetHelp.Info($"通过code换取网页授权access_token参数--appid:{appId}--secret:{secret}--code:{code}"); Log4NetHelp.Info($"通过code换取网页授权access_token返回结果--{content}--appid:{appId}--secret:{secret}--code:{code}"); if (!string.IsNullOrEmpty(content)) { var obj = JsonConvert.DeserializeObject (content); if (!obj.errcode.HasValue) { result.AccessToken = obj.access_token; result.OpenId = obj.openid; } } return result; } }