亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 微信小程式 微信開發(fā) 微信掃碼支付的Asp.Net MVC開發(fā)

微信掃碼支付的Asp.Net MVC開發(fā)

Mar 16, 2018 pm 01:47 PM
asp.net 開發(fā) 支付

這次帶給大家微信掃碼支付的Asp.Net MVC開發(fā),微信掃碼支付Asp.Net MVC開發(fā)的注意事項(xiàng)有哪些,以下就是實(shí)戰(zhàn)案例,一起來看一下。

這裡的掃碼支付指的是PC網(wǎng)站上面使用微信支付,也就是官方的模式二,網(wǎng)站是Asp.net MVC,整理如下。 (demo在最下方)

一、準(zhǔn)備工作

使用的微信API中的統(tǒng)一下單方法,關(guān)鍵的參數(shù)是'#大眾帳號(hào)ID (appid)','商家號(hào)(mch_id)'和'商家支付金鑰(KEY)',所以首先要有一個(gè)審核過的公眾號(hào),並開通支付功能,然後申請(qǐng)商戶,經(jīng)過審核後得到商家號(hào),也就是商家平臺(tái)的登入名稱。商家支付密鑰是用來簽署的,確保url不會(huì)被竄改。進(jìn)入商家平臺(tái)後在API安全中設(shè)置,是32位元的字串。

有這三個(gè)參數(shù)後,還有一點(diǎn)要注意的是交易起始時(shí)間交易結(jié)束時(shí)間的間隔應(yīng)該在五分鐘以上2小時(shí)以內(nèi)。不然獲取支付url的時(shí)候回報(bào)錯(cuò)。

二、產(chǎn)生支付二維碼

有了上面的參數(shù),接下來就是下載SDK: .net SDK及範(fàn)例?。

可惜官方的這個(gè)範(fàn)例一開始並不能運(yùn)作正確。把相關(guān)dll引用MVC目錄下。並創(chuàng)建一個(gè)WxPayAPI資料夾把相關(guān)類別複製過來。

??

然後將WxPayConfig中的相關(guān)參數(shù)設(shè)定成自己的參數(shù),再修改GetPayUrl方法,

?public?string?GetPayUrl(Order?order,string?ip)
????????{????????????if?(order?==?null)
????????????{????????????????throw?new?ArgumentNullException("order");
????????????}???????????
????????????var?product?=?order.OrderItems.First();
????????????WxPayData?data?=?new?WxPayData();
????????????data.SetValue("appid",?WxPayConfig.APPID);
????????????data.SetValue("mch_id",?WxPayConfig.MCHID);????????????//?data.SetValue("device_info",?"iphone4s");
????????????data.SetValue("nonce_str",?WxPayApi.GenerateNonceStr());
????????????data.SetValue("body",?product.AttributeDescription);//商品描述
????????????data.SetValue("detail",?product.AttributeDescription);//商品描述
????????????data.SetValue("attach",?"北京分店");//附加數(shù)據(jù)
????????????data.SetValue("out_trade_no",?order.TradeNumber);//隨機(jī)字符串???????????//?data.SetValue("total_fee",?Convert.ToInt32(order.OrderTotal?*?100));//總金額
????????????data.SetValue("total_fee",?1);//總金額
????????????data.SetValue("spbill_create_ip",ip);//總金額
????????????data.SetValue("time_start",?DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時(shí)間
????????????data.SetValue("time_expire",?DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss"));//交易結(jié)束時(shí)間
????????????data.SetValue("goods_tag",?"智能嬰兒床");//商品標(biāo)記
????????????data.SetValue("notify_url",?"http://www.xxxx.com/Checkout/ResultNotify");//通知地址
????????????data.SetValue("trade_type",?"NATIVE");//交易類型
????????????data.SetValue("product_id",?product.ProductId);//商品ID??
????????????data.SetValue("sign",?data.MakeSign());//簽名
????????????Logger.Info("獲得簽名"?+?data.GetValue("sign"));
????????????WxPayData?result?=?WxPayApi.UnifiedOrder(data);//調(diào)用統(tǒng)一下單接口????????????Logger.Info(result.ToJson());????????????string?url?=?result.GetValue("code_url").ToString();//獲得統(tǒng)一下單接口返回的二維碼鏈接
????????????Logger.Info("pay?url:"?+?url);????????????return?url;
????????}

TradeNumber是呼叫WxPayApi.GenerateOutTradeNo() 方法產(chǎn)生的,notify_url是用戶支付之後微信通知的位址。金額的單位是分,只能傳int型或string型,decimal需要轉(zhuǎn)換一下。取得url成功後,在負(fù)責(zé)付款的控制器中建立一個(gè)payment方法。用來顯示二維碼:

??ActionResult?Payment((??ArgumentException(?order?=?_orderService.GetOrderByGuid(?user?==??url2?==??+=

這裡只是回傳了一個(gè)url,在頁面上:

<img src="@ViewBag.QRCode" class="qrcode"  />

後臺(tái)用的qrCodeEncoder產(chǎn)生二維碼。

??public?FileResult?MakeQRCode(string?data)
????????{????????????if?(string.IsNullOrEmpty(data))?
????????????????throw?new?ArgumentException("data");????????????//初始化二維碼生成工具
????????????QRCodeEncoder?qrCodeEncoder?=?new?QRCodeEncoder();
????????????qrCodeEncoder.QRCodeEncodeMode?=?QRCodeEncoder.ENCODE_MODE.BYTE;
????????????qrCodeEncoder.QRCodeErrorCorrect?=?QRCodeEncoder.ERROR_CORRECTION.M;
????????????qrCodeEncoder.QRCodeVersion?=?0;
????????????qrCodeEncoder.QRCodeScale?=?4;????????????//將字符串生成二維碼圖片
????????????Bitmap?image?=?qrCodeEncoder.Encode(data,?Encoding.Default);????????????//保存為PNG到內(nèi)存流??
????????????MemoryStream?ms?=?new?MemoryStream();
????????????image.Save(ms,?ImageFormat.Jpeg);????????????return?File(ms.ToArray(),?"image/jpeg");
????????}

成功之後得到付款頁面:

掃碼後跳出支付頁面:

三、回呼

用戶付款之後,微信會(huì)給之前預(yù)留的介面(介面不能帶參數(shù))發(fā)送訊息, 網(wǎng)站在收到訊息後進(jìn)行驗(yàn)證和確認(rèn),確定之後再給微信發(fā)一個(gè)訊息。詳細(xì)參數(shù)和文件請(qǐng)看官方API

這裡還是把demo中的方法稍作改動(dòng)放到了控制器裡面:

??public?ActionResult?ResultNotify()
????????{????????????//接收從微信后臺(tái)POST過來的數(shù)據(jù)
????????????Stream?s?=?Request.InputStream;????????????int?count?=?0;????????????byte[]?buffer?=?new?byte[1024];
????????????StringBuilder?builder?=?new?StringBuilder();????????????while?((count?=?s.Read(buffer,?0,?1024))?>?0)
????????????{
????????????????builder.Append(Encoding.UTF8.GetString(buffer,?0,?count));
????????????}
????????????s.Flush();
????????????s.Close();
????????????s.Dispose();
????????????Logger.Info(this.GetType()+?"Receive?data?from?WeChat?:?"?+?builder);????????????//轉(zhuǎn)換數(shù)據(jù)格式并驗(yàn)證簽名
????????????WxPayData?data?=?new?WxPayData();????????????try
????????????{
????????????????data.FromXml(builder.ToString());
????????????}????????????catch?(WxPayException?ex)
????????????{????????????????//若簽名錯(cuò)誤,則立即返回結(jié)果給微信支付后臺(tái)
????????????????WxPayData?res?=?new?WxPayData();
????????????????res.SetValue("return_code",?"FAIL");
????????????????res.SetValue("return_msg",?ex.Message);
????????????????Log.Error(this.GetType().ToString(),?"Sign?check?error?:?"?+?res.ToXml());
????????????????Response.Write(res.ToXml());
????????????????Response.End();
????????????}
????????????Logger.Info(this.GetType()+?"Check?sign?success");
????????????ProcessNotify(data);????????????return?View();
????????}????????public?void?ProcessNotify(WxPayData?data)
????????{
????????????WxPayData?notifyData?=?data;????????????//檢查支付結(jié)果中transaction_id是否存在
????????????if?(!notifyData.IsSet("transaction_id"))
????????????{????????????????//若transaction_id不存在,則立即返回結(jié)果給微信支付后臺(tái)
????????????????WxPayData?res?=?new?WxPayData();
????????????????res.SetValue("return_code",?"FAIL");
????????????????res.SetValue("return_msg",?"支付結(jié)果中微信訂單號(hào)不存在");
????????????????Logger.Error(this.GetType()+"The?Pay?result?is?error?:?"?+?res.ToXml());
????????????????Response.Write(res.ToXml());
????????????????Response.End();
????????????}????????????string?transaction_id?=?notifyData.GetValue("transaction_id").ToString();????????????//查詢訂單,判斷訂單真實(shí)性
????????????if?(!QueryOrder(transaction_id))
????????????{????????????????//若訂單查詢失敗,則立即返回結(jié)果給微信支付后臺(tái)
????????????????WxPayData?res?=?new?WxPayData();
????????????????res.SetValue("return_code",?"FAIL");
????????????????res.SetValue("return_msg",?"訂單查詢失敗");
????????????????Logger.Error(this.GetType()+"Order?query?failure?:?"?+?res.ToXml());
????????????????Response.Write(res.ToXml());
????????????????Response.End();
????????????}????????????//查詢訂單成功
????????????else
????????????{
????????????????WxPayData?res?=?new?WxPayData();
????????????????res.SetValue("return_code",?"SUCCESS");
????????????????res.SetValue("return_msg",?"OK");
????????????????Logger.Info(this.GetType()+"order?query?success?:?"?+?res.ToXml());????????????????SetPaymentResult(data.GetValue("out_trade_no").ToString(),?PaymentStatus.Paid);
????????????????Response.Write(res.ToXml());
????????????????Response.End();
????????????}
????????}

收到確認(rèn)後,我們要更新訂單的狀態(tài):

??public?void?SetPaymentResult(string?tradeno,?PaymentStatus?status)
????????{
????????????Logger.Info("訂單號(hào):"+tradeno);????????????var?order?=?_orderService.GetOrderByTradeNumber(tradeno);????????????if?(order?!=?null)
????????????{
????????????????order.PaymentStatus?=?status;????????????????if?(status?==?PaymentStatus.Paid)
????????????????{
????????????????????order.PaidDate?=?DateTime.Now;
????????????????}
????????????????_orderService.UpdateOrder(order);
????????????????Logger.Info("訂單:"+tradeno+"成功更新狀態(tài)為"+status);
????????????}
????????}

然後在頁面上偵測(cè)訂單的狀態(tài),確定成功後,跳到頁面。

在商家平臺(tái)的後臺(tái),我們可以查詢到:

相信看了本文案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

推薦閱讀:

微信支付的退款功能開發(fā)

#H5的影片播放庫video.js詳解

微信硬體H5開發(fā)之控制燈光

JS裡特別好用的輕量級(jí)日期外掛

#

以上是微信掃碼支付的Asp.Net MVC開發(fā)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
百度地圖搭計(jì)程車如何支付 搭計(jì)程車的付款步驟介紹 百度地圖搭計(jì)程車如何支付 搭計(jì)程車的付款步驟介紹 Mar 13, 2024 am 10:04 AM

百度地圖APP現(xiàn)在已經(jīng)都成為了超多用戶們首選的出行導(dǎo)航的軟體,那麼這裡的一些功能全面,都能夠免費(fèi)的讓大家進(jìn)行選擇操作哦,解決自己日常出行方面會(huì)遇到的一些問題,完全都能夠查詢到自己的一些出行的路線,規(guī)劃自己的一些出行的方案,查詢完對(duì)應(yīng)的這一些路線,都能根據(jù)自己的需求,選擇合適的一些出行方式,那麼你們不管是選擇一些公共交通,騎行,步行或是搭計(jì)程車等,都能滿足你們的,有著對(duì)應(yīng)的一些導(dǎo)航路線,成功的帶領(lǐng)你們?nèi)ネ车?,那麼大家選擇打車的話,都能感到更加的方便,超多的一些司機(jī)們都是會(huì)在線上接單,搭計(jì)程車變得超級(jí)

四款值得推薦的AI輔助程式工具 四款值得推薦的AI輔助程式工具 Apr 22, 2024 pm 05:34 PM

這個(gè)AI輔助程式工具在這個(gè)AI快速發(fā)展的階段,挖掘出了一大批好用的AI輔助程式工具。 AI輔助程式設(shè)計(jì)工具能夠提升開發(fā)效率、提升程式碼品質(zhì)、降低bug率,是現(xiàn)代軟體開發(fā)過程中的重要助手。今天大姚給大家分享4款A(yù)I輔助程式工具(而且都支援C#語言),希望對(duì)大家有幫助。 https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款A(yù)I編碼助手,可幫助你更快、更省力地編寫程式碼,從而將更多精力集中在問題解決和協(xié)作上。 Git

AI程式設(shè)計(jì)師哪家強(qiáng)?探索Devin、通靈靈碼和SWE-agent的潛力 AI程式設(shè)計(jì)師哪家強(qiáng)?探索Devin、通靈靈碼和SWE-agent的潛力 Apr 07, 2024 am 09:10 AM

2022年3月3日,距離世界首個(gè)AI程式設(shè)計(jì)師Devin誕生不足一個(gè)月,普林斯頓大學(xué)的NLP團(tuán)隊(duì)開發(fā)了一個(gè)開源AI程式設(shè)計(jì)師SWE-agent。它利用GPT-4模型在GitHub儲(chǔ)存庫中自動(dòng)解決問題。 SWE-agent在SWE-bench測(cè)試集上的表現(xiàn)與Devin相似,平均耗時(shí)93秒,解決了12.29%的問題。 SWE-agent透過與專用終端交互,可以開啟、搜尋文件內(nèi)容,使用自動(dòng)語法檢查、編輯特定行,以及編寫和執(zhí)行測(cè)試。 (註:以上內(nèi)容為原始內(nèi)容微調(diào),但保留了原文中的關(guān)鍵訊息,未超過指定字?jǐn)?shù)限制。)SWE-A

學(xué)習(xí)如何利用Go語言開發(fā)行動(dòng)應(yīng)用程式 學(xué)習(xí)如何利用Go語言開發(fā)行動(dòng)應(yīng)用程式 Mar 28, 2024 pm 10:00 PM

Go語言開發(fā)行動(dòng)應(yīng)用程式教學(xué)隨著行動(dòng)應(yīng)用程式市場(chǎng)的不斷蓬勃發(fā)展,越來越多的開發(fā)者開始探索如何利用Go語言開發(fā)行動(dòng)應(yīng)用程式。作為一種簡(jiǎn)潔高效的程式語言,Go語言在行動(dòng)應(yīng)用開發(fā)中也展現(xiàn)了強(qiáng)大的潛力。本文將詳細(xì)介紹如何利用Go語言開發(fā)行動(dòng)應(yīng)用程序,並附上具體的程式碼範(fàn)例,幫助讀者快速入門並開始開發(fā)自己的行動(dòng)應(yīng)用程式。一、準(zhǔn)備工作在開始之前,我們需要準(zhǔn)備好開發(fā)環(huán)境和工具。首

Go語言前端技術(shù)探秘:前端開發(fā)新視野 Go語言前端技術(shù)探秘:前端開發(fā)新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的程式語言,在後端開發(fā)領(lǐng)域廣受歡迎。然而,很少有人將Go語言與前端開發(fā)聯(lián)繫起來。事實(shí)上,使用Go語言進(jìn)行前端開發(fā)不僅可以提高效率,還能為開發(fā)者帶來全新的視野。本文將探討使用Go語言進(jìn)行前端開發(fā)的可能性,並提供具體的程式碼範(fàn)例,幫助讀者更了解這一領(lǐng)域。在傳統(tǒng)的前端開發(fā)中,通常會(huì)使用JavaScript、HTML和CSS來建立使用者介面

五大熱門Go語言庫總表:開發(fā)必備利器 五大熱門Go語言庫總表:開發(fā)必備利器 Feb 22, 2024 pm 02:33 PM

五大熱門Go語言庫總結(jié):開發(fā)必備利器,需要具體程式碼範(fàn)例Go語言自從誕生以來,受到了廣泛的關(guān)注和應(yīng)用。作為一門新興的高效、簡(jiǎn)潔的程式語言,Go的快速發(fā)展離不開豐富的開源程式庫的支援。本文將介紹五大熱門的Go語言庫,這些庫在Go開發(fā)中扮演了至關(guān)重要的角色,為開發(fā)者提供了強(qiáng)大的功能和便利的開發(fā)體驗(yàn)。同時(shí),為了更好地理解這些庫的用途和功能,我們會(huì)結(jié)合具體的程式碼範(fàn)例進(jìn)行講

Android開發(fā)最適合的Linux發(fā)行版是哪一個(gè)? Android開發(fā)最適合的Linux發(fā)行版是哪一個(gè)? Mar 14, 2024 pm 12:30 PM

Android開發(fā)是一項(xiàng)繁忙而又令人興奮的工作,而選擇適合的Linux發(fā)行版來進(jìn)行開發(fā)則顯得尤為重要。在眾多的Linux發(fā)行版中,究竟哪一個(gè)最適合Android開發(fā)呢?本文將從幾個(gè)方面來探討這個(gè)問題,並給出具體的程式碼範(fàn)例。首先,我們來看看目前流行的幾個(gè)Linux發(fā)行版:Ubuntu、Fedora、Debian、CentOS等,它們都有各自的優(yōu)點(diǎn)和特點(diǎn)。

VSCode最適合哪種框架開發(fā)? VSCode最適合哪種框架開發(fā)? Mar 25, 2024 pm 02:03 PM

VSCode是一款功能強(qiáng)大、靈活、易於擴(kuò)充的開源程式碼編輯器,廣受開發(fā)者青睞。它支援眾多程式語言和框架,能夠滿足不同專案需求。但是,針對(duì)不同的框架,VSCode的優(yōu)勢(shì)可能有所不同。本文將討論VSCode在不同框架開發(fā)中的適用性,並提供具體的程式碼範(fàn)例。 1.ReactReact是一款流行的JavaScript庫,用於建立使用者介面。在使用React開發(fā)專案時(shí),

See all articles