微信小程式支付C#後端源碼

来源:https://www.cnblogs.com/oneall/archive/2018/08/28/9548722.html
-Advertisement-
Play Games

使用的是MVC .NET Framework4 微信小程式支付 小程式端源碼 MVC項目發佈前的配置 ...


  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Web;
  6 using System.Web.Mvc;
  7 using System.IO;
  8 using System.Security.Cryptography;
  9 using System.Text;
 10 using System.Xml;
 11 using Newtonsoft.Json;
 12 using Newtonsoft.Json.Linq;
 13 namespace Mvc_vue.Controllers
 14 {
 15     public class wxController : Controller
 16     {
 17         //
 18         // GET: /wx/
 19 
 20         public ActionResult Index()
 21         {
 22             return View();
 23         }
 24         //所需值
 25         public static string _appid = "wxd930ea5d5a258f4f";
 26         public static string _mch_id = "10000100";
 27         public static string _key = "192006250b4c09247ec02edce69f6a2d";
 28 
 29         //模擬wx統一下單 openid(前臺獲取)
 30         public string getda(string openid)
 31         {
 32             return Getprepay_id(_appid, "shanghaifendian", "monixiaofei", _mch_id, GetRandomString(30), "http://www.weixin.qq.com/wxpay/pay.php", openid, getRandomTime(), 1);
 33 
 34         }
 35 
 36         
 37 
 38         //微信統一下單獲取prepay_id & 再次簽名返回數據
 39         private static string Getprepay_id(string appid, string attach, string body, string mch_id, string nonce_str, string notify_url, string openid, string bookingNo, int total_fee)
 40         {
 41             var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信統一下單請求地址
 42             string strA = "appid=" + appid + "&attach=" + attach + "&body=" + body + "&mch_id=" + mch_id + "&nonce_str=" + nonce_str + "&notify_url=" + notify_url + "&openid=" + openid + "&out_trade_no=" + bookingNo + "&spbill_create_ip=61.50.221.43&total_fee=" + total_fee + "&trade_type=JSAPI";
 43             string strk = strA + "&key="+_key;  //key為商戶平臺設置的密鑰key(假)
 44             string strMD5 = MD5(strk).ToUpper();//MD5簽名
 45 
 46             //string strHash=HmacSHA256("sha256",strmd5).ToUpper();   //簽名方式只需一種(MD5 或 HmacSHA256     【支付文檔需仔細看】)
 47 
 48             //簽名
 49             var formData = "<xml>";
 50             formData += "<appid>" + appid + "</appid>";//appid  
 51             formData += "<attach>" + attach + "</attach>"; //附加數據(描述)
 52             formData += "<body>" + body + "</body>";//商品描述
 53             formData += "<mch_id>" + mch_id + "</mch_id>";//商戶號  
 54             formData += "<nonce_str>" + nonce_str + "</nonce_str>";//隨機字元串,不長於32位。  
 55             formData += "<notify_url>" + notify_url + "</notify_url>";//通知地址
 56             formData += "<openid>" + openid + "</openid>";//openid
 57             formData += "<out_trade_no>" + bookingNo + "</out_trade_no>";//商戶訂單號    --待
 58             formData += "<spbill_create_ip>61.50.221.43</spbill_create_ip>";//終端IP  --用戶ip
 59             formData += "<total_fee>" + total_fee + "</total_fee>";//支付金額單位為(分)
 60             formData += "<trade_type>JSAPI</trade_type>";//交易類型(JSAPI--公眾號支付)
 61             formData += "<sign>" + strMD5 + "</sign>"; //簽名
 62             formData += "</xml>";
 63 
 64 
 65 
 66             //請求數據
 67             var getdata = sendPost(url, formData);
 68 
 69             //獲取xml數據
 70             XmlDocument doc = new XmlDocument();
 71             doc.LoadXml(getdata);
 72             //xml格式轉json
 73             string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc);
 74 
 75 
 76 
 77             JObject jo = (JObject)JsonConvert.DeserializeObject(json);
 78             string prepay_id = jo["xml"]["prepay_id"]["#cdata-section"].ToString();
 79 
 80             //時間戳
 81             string _time = getTime().ToString();
 82 
 83             //再次簽名返回數據至小程式
 84             string strB = "appId=" + appid + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id + "&signType=MD5&timeStamp=" + _time + "&key="_key;
 85 
 86             //wx自己寫的一個類
 87             wx w = new wx();
 88             w.timeStamp = _time;
 89             w.nonceStr = nonce_str;
 90             w.package = "prepay_id=" + prepay_id;
 91             w.paySign = MD5(strB).ToUpper(); ;
 92             w.signType = "MD5";
 93 
 94             //向小程式返回json數據
 95              return JsonConvert.SerializeObject(w);
 96         }
 97 
 98         /// <summary>
 99         /// 生成隨機串    
100         /// </summary>
101         /// <param name="length">字元串長度</param>
102         /// <returns></returns>
103         private static string GetRandomString(int length)
104         {
105             const string key = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
106             if (length < 1)
107                 return string.Empty;
108 
109             Random rnd = new Random();
110             byte[] buffer = new byte[8];
111 
112             ulong bit = 31;
113             ulong result = 0;
114             int index = 0;
115             StringBuilder sb = new StringBuilder((length / 5 + 1) * 5);
116 
117             while (sb.Length < length)
118             {
119                 rnd.NextBytes(buffer);
120 
121                 buffer[5] = buffer[6] = buffer[7] = 0x00;
122                 result = BitConverter.ToUInt64(buffer, 0);
123 
124                 while (result > 0 && sb.Length < length)
125                 {
126                     index = (int)(bit & result);
127                     sb.Append(key[index]);
128                     result = result >> 5;
129                 }
130             }
131             return sb.ToString();
132         }
133 
134         /// <summary>
135         /// 獲取時間戳
136         /// </summary>
137         /// <returns></returns>
138         private static long getTime()
139         {
140             TimeSpan cha = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)));
141             long t = (long)cha.TotalSeconds;
142             return t;
143         }
144 
145 
146         /// <summary>
147         /// MD5簽名方法  
148         /// </summary>  
149         /// <param name="inputText">加密參數</param>  
150         /// <returns></returns>  
151         private static string MD5(string inputText)
152         {
153             MD5 md5 = new MD5CryptoServiceProvider();
154             byte[] fromData = System.Text.Encoding.UTF8.GetBytes(inputText);
155             byte[] targetData = md5.ComputeHash(fromData);
156             string byte2String = null;
157 
158             for (int i = 0; i < targetData.Length; i++)
159             {
160                 byte2String += targetData[i].ToString("x2");
161             }
162 
163             return byte2String;
164         }
165         /// <summary>
166         /// HMAC-SHA256簽名方式
167         /// </summary>
168         /// <param name="message"></param>
169         /// <param name="secret"></param>
170         /// <returns></returns>
171         private static string HmacSHA256(string message, string secret)
172         {
173             secret = secret ?? "";
174             var encoding = new System.Text.UTF8Encoding();
175             byte[] keyByte = encoding.GetBytes(secret);
176             byte[] messageBytes = encoding.GetBytes(message);
177             using (var hmacsha256 = new HMACSHA256(keyByte))
178             {
179                 byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
180                 return Convert.ToBase64String(hashmessage);
181             }
182         }
183 
184         /// <summary>
185         /// wx統一下單請求數據
186         /// </summary>
187         /// <param name="URL">請求地址</param>
188         /// <param name="urlArgs">參數</param>
189         /// <returns></returns>
190         private static string sendPost(string URL, string urlArgs)
191         {
192             
193             System.Net.WebClient wCient = new System.Net.WebClient();
194             wCient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
195             //byte[] postData = System.Text.Encoding.ASCII.GetBytes(urlArgs);  如果微信簽名中有中文會簽名失敗
196         byte[] postData = System.Text.Encoding.UTF8.GetBytes(urlArgs);     
197             byte[] responseData = wCient.UploadData(URL, "POST", postData);
198         
199             string returnStr = System.Text.Encoding.UTF8.GetString(responseData);//返回接受的數據 
200             return returnStr;
201          }
202 
203         /// <summary>
204         /// 生成訂單號
205         /// </summary>
206         /// <returns></returns>
207         private static string getRandomTime()
208         {
209             Random rd = new Random();//用於生成隨機數
210             string DateStr = DateTime.Now.ToString("yyyyMMddHHmmssMM");//日期
211             string str = DateStr + rd.Next(10000).ToString().PadLeft(4, '0');//帶日期的隨機數
212             return str;
213         }
214 
215     }
216 }

 

使用的是MVC .NET Framework4

微信小程式支付 小程式端源碼

MVC項目發佈前的配置


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 軟體環境:Goland 倉庫地址 一、目的 之前用純邏輯壘完了一個可登入登出的線上多人聊天室(代碼倉庫地址),這次學習了Protobuf協議,於是想試著更新下聊天室的版本。 主要目的是為了掌握Protobuf的使用。 二、設計思路 通過Protobuf中內置好的編碼函數,將要發送的數據進行編碼,之後 ...
  • python的網路編程有不少難點,也容易忘記,最近我會陸續發出系統、完整pythonnet知識的博客,一邊複習一邊分享,感興趣的可以關註我。 話不多說,開始吧。 網路編程 目的:數據的傳輸 ISO(國際標準化組織) OSI七層模型 >網路通信的標準化流程 應用層:提供用戶服務,具體的內容由特定的程式 ...
  • #include <stdio.h> void highPrecision (int N ); int a[50000] = {0, 1}, length = 1; //開闢一個大的數組,全局變數length記錄長度 int main() { int N; while( ~scanf("%d", & ...
  • PID對象是代表Actor對象的進程,是能過Actor.Spawn(props)獲取的;它有什麼成員呢?既然代理Actor,首先有一個ID,標識自己是誰,Actor在Spawn時可以命名這個ID,否則會自動生成。還有三種向郵箱發消息的方法,Tell(),Request(),RequestAsync(... ...
  • 這是我第一次主導項目,沒有什麼經驗。本來項目的開發周期為十天,由於沒有什麼經驗,導致開發時間由十天變為了二十一天, 一直到今天才算是正式結束,明天交付給客戶。回想起這幾天的經過,想總總結一下。 1、在項目剛開始的時候,沒有對項目的整體有一個概念性的認識,雖然是看了需求文檔,但是需求文檔上寫的很模糊。 ...
  • Office Online Server是微軟開發的一套基於Office實現線上文檔預覽編輯的技術框架(支持當前主流的瀏覽器,且瀏覽器上無需安裝任何插件,支持word、excel、ppt、pdf等文檔格式),其客戶端通過WebApi方式可集成到自已的應用中,支持Java、C#等語言。Office O... ...
  • 1、前言 上個星期完成了surging 的0.9.0.1 更新工作,此版本通過nuget下載引擎組件,下載後,無需通過代碼build集成,引擎會通過Sidecar模式自動掃描裝配異構組件來構建服務引擎,而這篇將介紹淺談surging服務引擎中的rabbitmq組件和容器化部署 surging源碼下載 ...
  • 我們知道,動態圖章,因圖章中的時間、日期可以動態的生成,因而具有較強的時效性。在本篇文章中將介紹通過C#編程在PDF中繪製動態圖章的方法,該方法可自動獲取當前系統登錄用戶名、日期及時間信息並生成圖章。 使用工具 Spire.PDF for .NET 註:下載安裝後,註意在程式中添加引用Spire.P ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...