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

首頁 微信小程式 微信開發(fā) 使用.NET解析微信支付的實作方法

使用.NET解析微信支付的實作方法

Mar 17, 2017 pm 03:21 PM
asp.net 微信支付

由於微信的廣泛利用,基於微信開發(fā)的一系列也應(yīng)運而生,這篇文章主要介紹了解析微信支付的實現(xiàn)方法(.NET版),有興趣的可以了解一下。

前段時間做了網(wǎng)頁版微信支付,遇到很多問題,不過最終還是解決了,現(xiàn)在在這裡記錄下開發(fā)流程以及說明,給其他人一些參考。

一、準(zhǔn)備工作

首先肯定得先要開通微信支付功能,之前開通微信支付需要三萬的押金的,現(xiàn)在不需要了,所以就做了這個功能。

要進(jìn)行微信支付開發(fā),需要在公眾號後臺和微信商家後臺進(jìn)行相關(guān)的設(shè)定。

1、開發(fā)目錄設(shè)定

微信支付需要在公眾號後臺(微信支付=》開發(fā)設(shè)定)進(jìn)行設(shè)定支付授權(quán)目錄。這裡授權(quán)目錄需要是線上位址,也就是可以透過網(wǎng)路存取的位址,微信支付系統(tǒng)需要能夠透過網(wǎng)路存取你的位址。

微信授權(quán)目錄需要精確到二級或三級目錄,事例:假如發(fā)起支付的連結(jié)是http://www.hxfspace.net/weixin/WeXinPay/WeXinPayChoose? 那麼設(shè)定的目錄應(yīng)該是http: //www.hxfspace.net/weixin/WeXinPay/ 其中http://www. hxfspace.net是網(wǎng)域名稱weixin是虛擬目錄WeXinPay也就是Controller 相關(guān)的付款請求都在WeXinPay中的action裡面。

使用.NET解析微信支付的實作方法

???????????

?2、OAuth2.0網(wǎng)頁授權(quán)網(wǎng)域設(shè)定

微函付款的時候會支付的時候會支付費用的時候會支付。對支付請求進(jìn)行回調(diào)來取得授權(quán)代碼(code),所以需要在這裡設(shè)定授權(quán)網(wǎng)域。當(dāng)然這裡網(wǎng)域是要和支付授權(quán)目錄中的網(wǎng)域是同一個。這個不要忘記設(shè)定了我當(dāng)時就是忘記設(shè)定然後找半天原因,哭死。 使用.NET解析微信支付的實作方法

3、相關(guān)參數(shù)準(zhǔn)備

#呼叫微信支付需要透過腳本向微信支付系統(tǒng)發(fā)起支付請求,參數(shù)說明請見微信官網(wǎng)支付平臺https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6?

使用.NET解析微信支付的實作方法





##其中package與paySign的產(chǎn)生需要開發(fā)者金鑰AppSecret(應(yīng)用程式金鑰)、微信商家號、微信支付金鑰

二、開發(fā)流程


廢話不多說直接說整理之後的流程:

1、透過微信授權(quán)回呼來取得授權(quán)code

2、透過授權(quán)code來換取網(wǎng)頁授權(quán)access_token 和openid


3、呼叫統(tǒng)一下單介面取得預(yù)付prepayId


4、組成jsapi微信支付請求參數(shù),發(fā)起支付


5、接收微信支付回呼進(jìn)行後續(xù)操作


三、具體開發(fā)(上碼)


微信支付只能在線上環(huán)境中進(jìn)行,調(diào)式很不方便,所在在剛開始開發(fā)的時候最好在每個關(guān)鍵位置記錄好日誌。


1、透過微信授權(quán)回呼來取得授權(quán)code


先把發(fā)起支付地址以及相關(guān)參數(shù)傳給微信支付接口,微信支付接收驗證成功之後,會重新請求你的付款地址並帶上授權(quán)code。


例如我這裡

 //判斷是否網(wǎng)頁授權(quán),獲取授權(quán)code,沒有代表沒有授權(quán),構(gòu)造網(wǎng)頁授權(quán)獲取code,并重新請求
      if (string.IsNullOrEmpty(Request.QueryString["code"]))
      {
        string redirectUrl = _weChatPaySerivce.GetAuthorizeUrl(account.AppId, account.RedquestUrl,
          "STATE" + "#wechat_redirect", "snsapi_base");
        return Redirect(redirectUrl);
      }


#拼接微信網(wǎng)頁授權(quán)Url方法







######################### ##
public string GetAuthorizeUrl(string appId, string redirectUrl, string state, string scope)
    {
      string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}",
          appId, HttpUtility.UrlEncode(redirectUrl), scope, state);
      /* 這一步發(fā)送之后,客戶會得到授權(quán)頁面,無論同意或拒絕,都會返回redirectUrl頁面。
       * 如果用戶同意授權(quán),頁面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE。這里的code用于換取access_token(和通用接口的access_token不通用)
       * 若用戶禁止授權(quán),則重定向后不會帶上code參數(shù),僅會帶上state參數(shù)redirect_uri?state=STATE
       */
      AppLog.Write("獲取到授權(quán)url:", AppLog.LogMessageType.Debug); 
      return url;
    }
############2、透過授權(quán)code來換取網(wǎng)頁授權(quán)access_token 和openid#########從第一步取得到授權(quán)code之後,組合網(wǎng)頁授權(quán)請求url,來取得access_token 和openid###############
 public Tuple<string, string> GetOpenidAndAccessTokenFromCode(string appId, string code, string appSecret)
    {
      Tuple<string, string> tuple = null;
      try
      {
        string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, appSecret, code);
        string result = WeChatPayHelper.Get(url);
        AppLog.Write("微信支付-獲取openid和access_token 請求Url:" + url + "result:" + result, AppLog.LogMessageType.Debug);
        if (!string.IsNullOrEmpty(result))
        {
          var jd=Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(result);
          tuple = new Tuple<string, string>(jd["openid"],jd["access_token"]);
          AppLog.Write("微信支付-獲取openid和access_token成功", AppLog.LogMessageType.Debug);
        }
      }
      catch (Exception ex)
      {
        AppLog.Write("微信支付:獲取openid和access_tokenu異常", AppLog.LogMessageType.Debug,ex);
      }
      return tuple;
    }
############3、呼叫統(tǒng)一下單一介面取得預(yù)付prepayId### ######?這裡RequestHandler是用的網(wǎng)路上別人封裝好的dll,幫你封裝好了簽名的產(chǎn)生以及一些驗證請求。 dll可以在這他們官網(wǎng)下載http://weixin.senparc.com/################
//創(chuàng)建支付應(yīng)答對象
      RequestHandler packageReqHandler = new RequestHandler(null);
      //初始化
      packageReqHandler.Init();
      //時間戳
      string timeStamp = TenPayUtil.GetTimestamp();
      //隨機字符串
      string nonceStr = TenPayUtil.GetNoncestr();
      //設(shè)置package訂單參數(shù) 生成prepayId預(yù)支付Id
      packageReqHandler.SetParameter("appid", account.AppId);     //公眾賬號ID
      packageReqHandler.SetParameter("mch_id", account.PartnertId);     //商戶號
      packageReqHandler.SetParameter("nonce_str", nonceStr);          //隨機字符串
      packageReqHandler.SetParameter("body", account.Body);
      packageReqHandler.SetParameter("out_trade_no", account.OrderSerialId);    //商家訂單號
      packageReqHandler.SetParameter("total_fee", account.TotalAmount);          //商品金額,以分為單位(money * 100).ToString()
      packageReqHandler.SetParameter("spbill_create_ip", account.RequestIp);  //用戶的公網(wǎng)ip,不是商戶服務(wù)器IP
      packageReqHandler.SetParameter("notify_url", account.NotifyUrl);      //接收財付通通知的URL
      packageReqHandler.SetParameter("trade_type", "JSAPI");            //交易類型
      packageReqHandler.SetParameter("openid", account.OpenId);            //用戶的openId
      string sign = packageReqHandler.CreateMd5Sign("key", account.PaySignKey);
      packageReqHandler.SetParameter("sign", sign);            //簽名
      string prepayId = string.Empty;
      try
      {
        string data = packageReqHandler.ParseXML();
        var result = TenPayV3.Unifiedorder(data);
        MailHelp.SendMail("調(diào)用統(tǒng)一下單接口,下單結(jié)果:--"+result+"請求參數(shù):"+data);
        var res = XDocument.Parse(result);
        prepayId = res.Element("xml").Element("prepay_id").Value;
        AppLog.Write("調(diào)用統(tǒng)一下單接口獲取預(yù)支付prepayId成功", AppLog.LogMessageType.Debug);
      }
      catch (Exception ex)
      {
        AppLog.Write("獲取到openid和access_tokenu異常", AppLog.LogMessageType.Debug, ex);
        MailHelp.SendMail("調(diào)用統(tǒng)一下單接口獲取預(yù)支付prepayid異常:", ex);
        return null;
      }
############4、組成jsapi微信支付請求參數(shù),發(fā)起支付######

我這里是首先組裝好微信支付所需要的參數(shù),然后再創(chuàng)建調(diào)用js腳本


//生成JsAPI支付參數(shù)
      RequestHandler paySignReqHandler = new RequestHandler(null);
      paySignReqHandler.SetParameter("appId", account.AppId);
      paySignReqHandler.SetParameter("timeStamp", timeStamp);
      paySignReqHandler.SetParameter("nonceStr", nonceStr);
      paySignReqHandler.SetParameter("package", string.Format("prepay_id={0}", prepayId));
      paySignReqHandler.SetParameter("signType", "MD5");
      string paySign = paySignReqHandler.CreateMd5Sign("key", account.PaySignKey);
      WeChatJsPayRequestModel resultModel = new WeChatJsPayRequestModel
      {
        AppId = account.AppId,
        NonceStr = nonceStr,
        TimeStamp = timeStamp,
        Package = string.Format("prepay_id={0}", prepayId),
        PaySign = paySign,
        SignType = "MD5"
      };


創(chuàng)建調(diào)用腳本


private string CreateWeixinJs(WeChatJsPayRequestModel model)
    {
      string js = @"<script type=&#39;text/javascript&#39;>
                callpay();
                function jsApiCall(){
                 WeixinJSBridge.invoke(
                  &#39;getBrandWCPayRequest&#39;, {
                    requestParam
                  },
                  function (res) {
                    if(res.err_msg == &#39;get_brand_wcpay_request:ok&#39; ){
                        window.location.href = &#39;successUrl&#39;;
                    }else{
                        window.location.href = &#39;failUrl&#39;;
                    }
                  }
                 ); 
                }
               function callpay()
                {
                  if (typeof WeixinJSBridge == &#39;undefined&#39;){
                    if( document.addEventListener ){
                      document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
                    }else if (document.attachEvent){
                      document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
                      document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall);
                    }
                  }else{
                    jsApiCall();
                  }
                }
            </script>";
      string requestParam = string.Format(@"&#39;appId&#39;: &#39;{0}&#39;,&#39;timeStamp&#39;: &#39;{1}&#39;,&#39;nonceStr&#39;: &#39;{2}&#39;,&#39;package&#39;: &#39;{3}&#39;,&#39;signType&#39;: &#39;{4}&#39;,&#39;paySign&#39;: &#39;{5}&#39;",
        model.AppId, model.TimeStamp, model.NonceStr, model.Package, model.SignType, model.PaySign);
      js = js.Replace("requestParam", requestParam)
        .Replace("successUrl", model.JumpUrl + "&result=1")
        .Replace("failUrl", model.JumpUrl + "&result=0");
      AppLog.Write("生成可執(zhí)行腳本成功", AppLog.LogMessageType.Debug);
      return js;
    }


5、接收微信支付回調(diào)進(jìn)行后續(xù)操作

回調(diào)的時候首先需要驗證簽名是否正確,保證安全性,簽名驗證通過之后再進(jìn)行后續(xù)的操作,訂單狀態(tài)、通知啥的。


ResponseHandler resHandler = new ResponseHandler(System.Web.HttpContext.Current);
      bool isSuccess = _weChatPaySerivce.ProcessNotify(resHandler);
      if (isSuccess)
      {
        string result = @"<xml>
                  <return_code><![CDATA[SUCCESS]]></return_code>
                  <return_msg><![CDATA[支付成功]]></return_msg>
                 </xml>";
        HttpContext.Response.Write(result);
        HttpContext.Response.End();
      }
      return new EmptyResult();


這里有一點需要注意,就是微信支付回調(diào)的時候微信會通知八次,好像是這個數(shù)吧,所以你需要在第一次收到通知之后,把收到請求這個狀態(tài)以xml的格式響應(yīng)給微信支付接口。當(dāng)然你不進(jìn)行這個操作也是可以的,再回調(diào)的時候 每次去判斷該訂單是否已經(jīng)回調(diào)成功,回調(diào)成功則不進(jìn)行處理就可以了。


以上是使用.NET解析微信支付的實作方法的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
微信支付密碼忘了怎麼找回 微信支付密碼忘了怎麼找回 Feb 23, 2024 pm 09:40 PM

微信中使用者可以輸入付款密碼購物,那麼付款密碼忘了怎麼找回來呢?用戶需要我的-服務(wù)-錢包-支付設(shè)定-忘記支付密碼就能恢復(fù)。這篇支付密碼忘記找回方法介紹就能告訴大家具體的操作方法,以下就是詳細(xì)介紹,趕快看看吧!微信使用教程微信支付密碼忘記了怎麼找回答:我的-服務(wù)-錢包-支付設(shè)定-忘記支付密碼具體方法:1、先點擊我的。 2、點選裡面的服務(wù)。 3.點擊裡面的錢包。 4、找到支付設(shè)定。 5.點選忘記支付密碼。 6、輸入自己的資料驗證。 7.然後輸入新的支付密碼就可以更改了。

微信支付密碼忘了怎麼辦 微信支付密碼忘了怎麼辦 Jan 08, 2024 pm 05:02 PM

微信支付密碼忘記了的解決辦法:1、打開微信APP,點擊右下角的”我“,進(jìn)入個人中心頁面;2、在個人中心頁面中,點擊“支付”,進(jìn)入支付頁面;3、在支付頁面中,點選右上角的“…”,進(jìn)入付款管理頁面;4、在付款管理頁面中,找到並點擊“忘記支付密碼”;5、按照頁面提示,輸入個人資訊進(jìn)行身份驗證,驗證成功後,可以選擇「刷臉找回」或「驗證銀行卡資訊找回」的方式來找回密碼等等。

微信支付扣款順序怎麼設(shè)置 微信支付扣款順序怎麼設(shè)置 Sep 06, 2023 am 11:11 AM

微信支付扣款順序設(shè)定步驟:1、開啟微信APP,點選「我」介面,點選「服務(wù)」,再點選「收付款」;2、點選收付款介面付款碼下方的「優(yōu)先使用此付款方式」; 3.選擇自己需要的優(yōu)先支付方式即可。

美團(tuán)外送怎麼設(shè)定微信支付 設(shè)定微信付款的方法 美團(tuán)外送怎麼設(shè)定微信支付 設(shè)定微信付款的方法 Mar 12, 2024 pm 10:34 PM

  美團(tuán)外帶app軟體內(nèi)提供的美食小吃店舖非常多,而且所有的手機用戶都是透過帳號登入的。新增個人的收貨地址以及聯(lián)絡(luò)電話,享受最方便的外帶服務(wù)。打開軟體首頁,即可輸入商品關(guān)鍵字,線上搜尋就能找到相對應(yīng)的商品結(jié)果,上下滑動選購下單即可,平臺也會根據(jù)用戶提供的配送地址,推薦週邊附近數(shù)十家好評超高的店鋪,還能設(shè)定不同的支付方式,一鍵下單完成訂單即可,騎手第一時間安排配送速度非??欤€有不同金額的外賣紅包領(lǐng)取使用,現(xiàn)在小編在線詳細(xì)為美團(tuán)外賣用戶們帶來設(shè)定微信付款的方法?! ?選擇好商品後,提交訂單,點選立

閒魚可以用微信付錢嗎 改成微信付款的方法 閒魚可以用微信付錢嗎 改成微信付款的方法 Mar 12, 2024 pm 12:19 PM

大家沒事的時候,都是會選擇逛逛閒魚這一平臺的,大家都能夠發(fā)現(xiàn)這一平臺上,是有著大量的一些商品的存在,都能夠讓大家看到各種各樣的一些二手的寶貝,雖然是二手的產(chǎn)品,但是這一些產(chǎn)品的質(zhì)量,絕對都是沒有任何的問題,所以大家都能夠放心的選購,價格都是特別的實惠,都還是能讓大家面對面的與這一些賣家們進(jìn)行交流溝通,進(jìn)行一些講價的操作,完全都是可以的,只要大家談的妥當(dāng)?shù)脑?,那麼你們就能夠選擇進(jìn)行交易,且大家在這裡付款的時候,想要進(jìn)行微信付款,但是好像平臺上是不允許,具體情況如何,跟著小編一起來看看吧。閒魚

微信支付成功後能馬上取消嗎 微信支付成功後能馬上取消嗎 Nov 29, 2023 pm 02:19 PM

微信支付成功後不能馬上取消。退款通常需要滿足以下條件:1、商家的退款政策,商家會制定自己的退款政策,包括退款的時間窗口、退款金額和退款方式等;2、支付時間,退款通常需要在一定的時間範(fàn)圍內(nèi)進(jìn)行申請,超過該時間範(fàn)圍可能無法退款;3、商品或服務(wù)狀態(tài),如果用戶已經(jīng)收到了商品或享受了服務(wù),商家可能會要求用戶將商品退回或提供相應(yīng)的證明; 4、退款流程等等。

滴滴出行怎麼設(shè)定微信支付 設(shè)定微信支付的方法 滴滴出行怎麼設(shè)定微信支付 設(shè)定微信支付的方法 Mar 13, 2024 pm 01:22 PM

滴滴出行app為大家日常出行提供更多方便,想去哪裡就去那裡,而且所有的滴滴車輛都是隨叫隨到的,再也不需要焦急等待了,數(shù)十個打車紅包免費領(lǐng),出行速度更快。打開軟體首頁,依照個人的行程安排,輸入出發(fā)點以及目的地,正下方不同價位的車輛自由選擇,一鍵下單發(fā)布行程出去,滴滴司機都是秒接單的,以最快的速度到達(dá)指定地點,上車前核對手機號即可,當(dāng)然支付車費的方式非常多,微信支付寶都可以,但大家通常都是用微信,一鍵設(shè)定支付輕鬆搞定,現(xiàn)在小編在線仔細(xì)一一為滴滴出行用戶帶來設(shè)定微信支付的方法?! ?、我們在手機

微信支付申請退款的步驟分享 微信支付申請退款的步驟分享 Mar 25, 2024 pm 06:31 PM

1.首先我們需要打開手機上的微信APP,然後點選登入微信帳號,這樣就進(jìn)入了微信的首頁。 2.在微信首頁點選右下角的【我】按鈕,再選擇【付款】選項,我們點選進(jìn)入支付頁面。 3.進(jìn)入【付款】頁面後點選【錢包】選項進(jìn)入,在【錢包】頁面點選右上角的【帳單】。

See all articles