tnblog
首页
视频
资源
登录

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

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


评价

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;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.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...
一木浮沉,吾与之。
排名
63
文章
6
粉丝
2
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
只羡忘羡不羡仙,说是天天就天天