tnblog
首页
视频
资源
登录

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

6134人阅读 2023/2/23 16:55 总访问:29835 评论:0 收藏:2 手机
分类: 微信支付
  1. /// <summary>
  2. /// JSApi 调用类
  3. /// </summary>
  4. public class WxPayJsApi {
  5.     //获取 调起支付 API参数 
  6.     public string GetJsApiParameters(string prepay_id) {
  7.         WcPayChooseRequest request = new WcPayChooseRequest(
  8.             WxPayConfig.APPID,
  9.             WxPayUitls.GenerateTimeStampString(),
  10.             WxPayUitls.GenerateNonceStr(),
  11.             "prepay_id=" + prepay_id, "RSA");
  12.         request.paySign = WxPayEncrypt.MakePaySign(request.GetMessage(request));
  13.         string parameters = request.ToJsonStr();
  14.         return parameters;
  15.     }
  16.     /// <summary>
  17.     /// 返回 config 注入参数
  18.     /// </summary>
  19.     /// <param name="url"></param>
  20.     /// <returns></returns>
  21.     public string GetJsApiConfig(string url) {
  22.         WxPayApiJSDK config = new WxPayApiJSDK(true,
  23.             WxPayConfig.APPID,
  24.             WxPayUitls.GenerateTimeStampString(),
  25.             WxPayUitls.GenerateNonceStr(), url
  26.         );
  27.         //正式上线 需要添加正确api列表
  28.         var enumValues = Enum.GetValues(typeof(WechatPayApiEnum));
  29.         foreach(Enum value in enumValues) {
  30.             config.JsApiList.Add(value.ToString());
  31.         }
  32.         string parameters = config.ToJsonToFrontStr();
  33.         return parameters;
  34.     }
  35. }
  36. /// <summary>
  37. /// 注入 JSDK config 类
  38. /// </summary>
  39. public class WxPayApiJSDK {
  40.     private bool debug;
  41.     private string appId;
  42.     private string timestamp;
  43.     private string nonceStr;
  44.     private string signature;
  45.     private List < string > jsApiList = new List < string > ();
  46.     private string url;
  47.     private string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
  48.     public WxPayApiJSDK(bool debug, string appId, string timestamp, string nonceStr, string url) {
  49.         this.debug = debug;
  50.         this.appId = appId;
  51.         this.timestamp = timestamp;
  52.         this.nonceStr = nonceStr;
  53.         this.url = url;
  54.         this.signature = GetConfigSignature();
  55.     }
  56.     /// <summary>
  57.     /// 是否开启调试模式
  58.     /// </summary>
  59.     public bool Debug {
  60.         get {
  61.             return debug;
  62.         }
  63.         set {
  64.             debug = value;
  65.         }
  66.     }
  67.     /// <summary>
  68.     /// 必填,公众号的唯一标识
  69.     /// </summary>
  70.     public string AppId {
  71.         get {
  72.             return appId;
  73.         }
  74.         set {
  75.             appId = value;
  76.         }
  77.     }
  78.     /// <summary>
  79.     /// 必填,生成签名的时间戳
  80.     /// </summary>
  81.     public string Timestamp {
  82.         get {
  83.             return timestamp;
  84.         }
  85.         set {
  86.             timestamp = value;
  87.         }
  88.     }
  89.     /// <summary>
  90.     /// 必填,生成签名的随机串
  91.     /// </summary>
  92.     public string NonceStr {
  93.         get {
  94.             return nonceStr;
  95.         }
  96.         set {
  97.             nonceStr = value;
  98.         }
  99.     }
  100.     /// <summary>
  101.     /// 必填,签名
  102.     /// </summary>
  103.     public string Signature {
  104.         get {
  105.             return signature;
  106.         }
  107.         set {
  108.             signature = value;
  109.         }
  110.     }
  111.     /// <summary>
  112.     /// 必填,需要使用的JS接口列表
  113.     /// </summary>
  114.     public List < string > JsApiList {
  115.         get {
  116.             return jsApiList;
  117.         }
  118.         set {
  119.             jsApiList = value;
  120.         }
  121.     }
  122.     public string Url {
  123.         get {
  124.             return url;
  125.         }
  126.         set {
  127.             url = value;
  128.         }
  129.     }
  130.     /// <summary>
  131.     /// 生成注入config签名
  132.     /// </summary>
  133.     /// <param name="request"></param>
  134.     /// <returns></returns>
  135.     private string GetConfigSignature() {
  136.         Hashtable hs = new Hashtable();
  137.         hs.Add("jsapi_ticket", Getjsapi_ticket()); //获取的
  138.         hs.Add("noncestr", NonceStr);
  139.         hs.Add("timestamp", Timestamp);
  140.         hs.Add("url", Url);
  141.         //得到string1
  142.         string string1 = formatParameters(hs);
  143.         //对string1进行sha1签名
  144.         Signature = GetHashSigntrue(string1);
  145.         return Signature;
  146.     }
  147.     /// <summary>
  148.     /// 参数名ASCII码从小到大排序(字典序)
  149.     /// </summary>
  150.     /// <param name="parameters"></param>
  151.     /// <returns></returns>
  152.     private string formatParameters(Hashtable parameters) {
  153.         StringBuilder sb = new StringBuilder();
  154.         ArrayList akeys = new ArrayList(parameters.Keys);
  155.         akeys.Sort();
  156.         foreach(string k in akeys) {
  157.             string v = (string) parameters[k]; //防止参数不是字符串
  158.             sb.Append(k.ToLower() + "=" + v + "&");
  159.         }
  160.         //去掉最后一个&
  161.         if (sb.Length > 0) {
  162.             sb.Remove(sb.Length - 11);
  163.         }
  164.         return sb.ToString();
  165.     }
  166.     /// <summary>
  167.     /// 进行sha1签名
  168.     /// </summary>
  169.     /// <param name="str"></param>
  170.     /// <returns></returns>
  171.     public static string HashCode(string str) {
  172.         string rethash = "";
  173.         try {
  174.             SHA1 hash = SHA1.Create();
  175.             rethash = Convert.ToBase64String(hash.ComputeHash(Encoding.UTF8.GetBytes(str)));
  176.         } catch (Exception ex) {
  177.             string strerr = "Error in HashCode : " + ex.Message;
  178.         }
  179.         return rethash;
  180.     }
  181.     public string GetHashSigntrue(string str) {
  182.         var sha1 = new SHA1Managed();
  183.         var sha1bytes = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(str);
  184.         byte[] resultHash = sha1.ComputeHash(sha1bytes);
  185.         string sha1String = BitConverter.ToString(resultHash).ToLower();
  186.         sha1String = sha1String.Replace("-""");
  187.         return sha1String;
  188.     }
  189.     public string GetAccess_Token(WxPayConfig payConfig) {
  190.         var cache = CacheHelper.Instance;
  191.         string access_token = string.Empty;
  192.         if (cache.GetValue(WxPayCacheKeys.JSAPI_TICKET) == null) {
  193.             string AppID = payConfig.AppID;
  194.             string AppSecret = payConfig.AppSecret;
  195.             string url = string.Format(tokenUrl, AppID, AppSecret);
  196.             System.Net.WebRequest wrq = System.Net.WebRequest.Create(url);
  197.             wrq.Method = "GET";
  198.             System.Net.WebResponse wrp = wrq.GetResponse();
  199.             System.IO.StreamReader sr = new System.IO.StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
  200.             string strResult = sr.ReadToEnd();
  201.             JObject pairs = JObject.Parse(strResult);
  202.             access_token = pairs["access_token"].ToString();
  203.         } else access_token = cache.GetValue(WxPayCacheKeys.ACCESS_TOKEN).ToString();
  204.         return access_token;
  205.     }
  206.     public string Getjsapi_ticket(WxPayConfig payConfig) {
  207.         var cache = CacheHelper.Instance;
  208.         string Jsapi_ticket = string.Empty;
  209.         string access_token = string.Empty;
  210.         string accessToken = payConfig.AppID + WxPayCacheKeys.ACCESS_TOKEN;
  211.         string jsapiTicket = payConfig.AppID + WxPayCacheKeys.JSAPI_TICKET;
  212.         if (cache.GetValue(jsapiTicket) == null) {
  213.             string url = string.Empty;
  214.             string strResult = string.Empty;
  215.             System.Net.WebRequest wrq = null;
  216.             System.Net.WebResponse wrp = null;
  217.             System.IO.StreamReader sr = null;
  218.             JObject pairs = null;
  219.             if (cache.GetValue(accessToken) == null) {
  220.                 string AppID = payConfig.AppID;
  221.                 string AppSecret = payConfig.AppSecret;
  222.                 url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppID, AppSecret);
  223.                 wrq = System.Net.WebRequest.Create(url);
  224.                 wrq.Method = "GET";
  225.                 wrp = wrq.GetResponse();
  226.                 sr = new System.IO.StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
  227.                 strResult = sr.ReadToEnd();
  228.                 pairs = JObject.Parse(strResult);
  229.                 if (!strResult.Contains("access_token")) {
  230.                     return "not in whitelist rid";
  231.                 }
  232.                 access_token = pairs["access_token"].ToString();
  233.                 sr.Close();
  234.             } else {
  235.                 access_token = cache.GetValue(accessToken).ToString();
  236.             }
  237.             url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
  238.             wrq = System.Net.WebRequest.Create(url);
  239.             wrp = wrq.GetResponse();
  240.             sr = new System.IO.StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
  241.             string backStr = sr.ReadToEnd();
  242.             //string backStr = "{ \"errcode\":0,\"errmsg\":\"ok\",\"ticket\":\"kgt8ON7yVITDhtdwci0qeZWDYY9llY5RrKsWxKD--zOUIRYqJ1XwMo305bwZhG22b5hOl-TZ-gZAXCbMMHwvCw\",\"expires_in\":7200}";
  243.             pairs = JObject.Parse(backStr);
  244.             var code = pairs["errcode"].ToString();
  245.             if (code != "0") {
  246.                 return pairs["errmsg"].ToString();
  247.             }
  248.             Jsapi_ticket = pairs["ticket"].ToString();
  249.             cache.InsertAndAbsoluteExp(accessToken, access_token, WxPayCacheKeys.ExpirationTime - 5);
  250.             cache.InsertAndAbsoluteExp(jsapiTicket, Jsapi_ticket, WxPayCacheKeys.ExpirationTime - 5);
  251.         } else Jsapi_ticket = cache.GetValue(jsapiTicket).ToString();
  252.         return Jsapi_ticket;
  253.     }
  254. }


评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

asp.net主动推送百度seo

虽然可以使用百度提供的js自动推送,但是估计度娘还是希望主动推送一点。哈哈^_^,女孩子嘛大多都喜欢被动一点。publicclass...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...
一木浮沉,吾与之。
排名
63
文章
6
粉丝
2
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
因为你喜欢海,所以我一直浪。