亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#版在pc端發起微信掃碼支付的實例

2020-01-24 00:56:34
字體:
來源:轉載
供稿:網友

等了好久,微信官方終于發布了.net的demo。

主要代碼:

/**  * 生成直接支付url,支付url有效期為2小時,模式二  * @param productId 商品ID  * @return 模式二URL  */  public string GetPayUrl(string productId, string body, string attach, int total_fee, string goods_tag)  {   Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");   WxPayData data = new WxPayData();   data.SetValue("body", body);//商品描述   data.SetValue("attach", attach);//附加數據   data.SetValue("out_trade_no", productId);//隨機字符串   data.SetValue("total_fee", total_fee);//總金額   data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時間   data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易結束時間   data.SetValue("goods_tag", goods_tag);//商品標記   data.SetValue("trade_type", "NATIVE");//交易類型   data.SetValue("product_id", productId);//商品ID   WxPayData result = WxPayApi.UnifiedOrder(data);//調用統一下單接口   string url = result.GetValue("code_url").ToString();//獲得統一下單接口返回的二維碼鏈接   Log.Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url);   return url;  }

配置信息:

public class Config {  //=======【基本信息設置】=====================================  /* 微信公眾號信息配置  * APPID:綁定支付的APPID(必須配置)  * MCHID:商戶號(必須配置)  * KEY:商戶支付密鑰,參考開戶郵件設置(必須配置)  * APPSECRET:公眾帳號secert(僅JSAPI支付的時候需要配置)  */  public const string APPID = "你的微信公眾號APPID";  public const string MCHID = "你的微信公眾號的商戶號";  public const string KEY = "你的微信公眾號的商戶支付密鑰";  public const string APPSECRET = "你的微信公眾號的APPSECRET";  //=======【證書路徑設置】=====================================   /* 證書路徑,注意應該填寫絕對路徑(僅退款、撤銷訂單時需要)  */  public const string SSLCERT_PATH = "cert/apiclient_cert.p12";  public const string SSLCERT_PASSWORD = "1233410002";  //=======【支付結果通知url】=====================================   /* 支付結果通知回調url,用于商戶接收支付結果  */  public const string NOTIFY_URL = "http://你的網站/Pay/ResultNotifyPage.aspx";  //=======【商戶系統后臺機器IP】=====================================   /* 此參數可手動配置也可在程序中自動獲取  */  public const string IP = "你的服務器IP";  //=======【代理服務器設置】===================================  /* 默認IP和端口號分別為0.0.0.0和0,此時不開啟代理(如有需要才設置)  */  public const string PROXY_URL = "";  //=======【上報信息配置】===================================  /* 測速上報等級,0.關閉上報; 1.僅錯誤時上報; 2.全量上報  */  public const int REPORT_LEVENL = 1;  //=======【日志級別】===================================  /* 日志等級,0.不輸出日志;1.只輸出錯誤信息; 2.輸出錯誤和正常信息; 3.輸出錯誤信息、正常信息和調試信息  */  public const int LOG_LEVENL = 0; }

 不使用代理要注釋HttpService.cs里面post和get方法的下面代碼:
 

//設置代理服務器    //WebProxy proxy = new WebProxy();       //定義一個網關對象    //proxy.Address = new Uri(Config.PROXY_URL);    //網關服務器端口:端口    //request.Proxy = proxy;

統一下單:

/**  *   * 統一下單  * @param WxPaydata inputObj 提交給統一下單API的參數  * @param int timeOut 超時時間  * @throws WxPayException  * @return 成功時返回,其他拋異常  */  public static WxPayData UnifiedOrder(WxPayData inputObj, int timeOut = 6)  {   string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";   //檢測必填參數   if (!inputObj.IsSet("out_trade_no"))   {    throw new WxPayException("缺少統一支付接口必填參數out_trade_no!");   }   else if (!inputObj.IsSet("body"))   {    throw new WxPayException("缺少統一支付接口必填參數body!");   }   else if (!inputObj.IsSet("total_fee"))   {    throw new WxPayException("缺少統一支付接口必填參數total_fee!");   }   else if (!inputObj.IsSet("trade_type"))   {    throw new WxPayException("缺少統一支付接口必填參數trade_type!");   }   //關聯參數   if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))   {    throw new WxPayException("統一支付接口中,缺少必填參數openid!trade_type為JSAPI時,openid為必填參數!");   }   if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))   {    throw new WxPayException("統一支付接口中,缺少必填參數product_id!trade_type為JSAPI時,product_id為必填參數!");   }   //異步通知url未設置,則使用配置文件中的url   if (!inputObj.IsSet("notify_url"))   {    inputObj.SetValue("notify_url", Config.NOTIFY_URL);//異步通知url   }   inputObj.SetValue("appid", Config.APPID);//公眾賬號ID   inputObj.SetValue("mch_id", Config.MCHID);//商戶號   inputObj.SetValue("spbill_create_ip", Config.IP);//終端ip       inputObj.SetValue("nonce_str", GenerateNonceStr());//隨機字符串   //簽名   inputObj.SetValue("sign", inputObj.MakeSign());   string xml = inputObj.ToXml();   var start = DateTime.Now;   Log.Debug("WxPayApi", "UnfiedOrder request : " + xml);   string response = HttpService.Post(xml, url, false, timeOut);   Log.Debug("WxPayApi", "UnfiedOrder response : " + response);   var end = DateTime.Now;   int timeCost = (int)((end - start).TotalMilliseconds);   WxPayData result = new WxPayData();   result.FromXml(response);   ReportCostTime(url, timeCost, result);//測速上報   return result;  }

看我的調用例子:

MakeQRCode.aspx頁面照抄:

public partial class Pay_MakeQRCode : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) {  if (!string.IsNullOrEmpty(base.Request.QueryString["data"]))  {   string str = base.Request.QueryString["data"];   Bitmap image = new QRCodeEncoder   {    QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,    QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M,    QRCodeVersion = 0,    QRCodeScale = 4   }.Encode(str, Encoding.Default);   MemoryStream ms = new MemoryStream();   image.Save(ms, ImageFormat.Png);   base.Response.BinaryWrite(ms.GetBuffer());   base.Response.End();  } }}

這個頁面是用來生成二維碼的,需要引入ThoughtWorks.QRCode.dll組件。

我使用模式二,回調頁面是ResultNotifyPage.aspx,就是在配置信息那里填寫的那個回調頁面。

protected void Page_Load(object sender, EventArgs e) {  ResultNotify resultNotify = new ResultNotify(this);  WxPayData res = resultNotify.ProcessNotify2();  if (res.GetValue("return_code") == "SUCCESS")  {   //查詢微信訂單信息   string paySignKey = ConfigurationManager.AppSettings["paySignKey"].ToString();   string mch_id = ConfigurationManager.AppSettings["mch_id"].ToString();   string appId = ConfigurationManager.AppSettings["AppId"].ToString();   QueryOrder queryorder = new QueryOrder();   queryorder.appid = appId;   queryorder.mch_id = mch_id;   queryorder.transaction_id = res.GetValue("transaction_id").ToString();   queryorder.out_trade_no = "";   queryorder.nonce_str = TenpayUtil.getNoncestr();   TenpayUtil tenpay = new TenpayUtil();   OrderDetail orderdeatil = tenpay.getOrderDetail(queryorder, paySignKey);   //寫微信記錄   (new vinson()).WriteReturnWXDetail(orderdeatil);   //寫充值記錄   FilliedOnline(orderdeatil.out_trade_no);  }  Response.Write(res.ToXml());  Response.End(); }

 掃碼支付成功后會異步到這個頁面執行代碼,我們自己的業務邏輯就要寫在這里。使用微信官方的ProcessNotify()函數可不行,我們稍微修改下就好了。增加ProcessNotify2函數:
 

public WxPayData ProcessNotify2()  {   WxPayData notifyData = GetNotifyData();   //檢查支付結果中transaction_id是否存在   if (!notifyData.IsSet("transaction_id"))   {    //若transaction_id不存在,則立即返回結果給微信支付后臺    WxPayData res = new WxPayData();    res.SetValue("transaction_id", "");    res.SetValue("return_code", "FAIL");    res.SetValue("return_msg", "支付結果中微信訂單號不存在");    return res;   }   string transaction_id = notifyData.GetValue("transaction_id").ToString();   //查詢訂單,判斷訂單真實性   if (!QueryOrder(transaction_id))   {    //若訂單查詢失敗,則立即返回結果給微信支付后臺    WxPayData res = new WxPayData();    res.SetValue("transaction_id", transaction_id);    res.SetValue("return_code", "FAIL");    res.SetValue("return_msg", "訂單查詢失敗");    return res;   }   //查詢訂單成功   else   {    WxPayData res = new WxPayData();    res.SetValue("transaction_id", transaction_id);    res.SetValue("return_code", "SUCCESS");    res.SetValue("return_msg", "OK");    return res;   }  }

返回WxPayData對象,這樣一判斷

if (res.GetValue("return_code") == "SUCCESS")

表示支付成功,就可以進入我們的業務邏輯。

然后我們還要對當前訂單查單,獲取訂單的相關信息,之前微信未出demo的時候我自己寫了個查單的,就直接用了,關鍵WxPayData對象會返回微信的訂單號:res.GetValue("transaction_id").ToString()。

完事后還要發送信息回給微信,通知微信后臺不要繼續發送異步請求了:

    

 Response.Write(res.ToXml());  Response.End();

這個代碼比較重要了。

再說說放置二維碼的頁面:

<div class="g-body"> <div class="g-wrap">  <div class="m-weixin">   <div class="m-weixin-header">    <p><strong>請您及時付款,以便訂單盡快處理!訂單號:<asp:Label ID="trade_no" runat="server" Text="Label"></asp:Label></strong></p>    <p>請您在提交訂單后1小時內支付,否則訂單會自動取消。</p>   </div>   <div class="m-weixin-main">    <h1 class="m-weixin-title">     <img alt="微信支付" src="../images/wxlogo_pay.png"/>    </h1>    <p class="m-weixin-money"><font>掃一掃付款</font><br/><strong>¥<asp:Label ID="money" runat="server" Text="Label"></asp:Label></strong></p>    <p>     <img id="payQRImg" width="260" height="260" class="m-weixin-code" style="position: absolute;" src="<%=ImageUrl %>" alt="二維碼" style="border-width:0px;" />     <img class="m-weixin-demo" src="../images/wxwebpay_guide.png" alt="掃一掃" />     <img style="margin-top:300px;" src="../images/weixin_1.png" alt="請使用微信掃描二維碼以完成支付" />    </p>    <p id="we_ok" style="display:none;">     <input value="完成" style="width: 300px; height: 50px; background: rgb(21, 164, 21) none repeat scroll 0% 0%; color: white; font-size: 30px; border: medium none; cursor: pointer;" type="button" />    </p>   </div>  </div> </div></div>

寫個js查單支付情況進行顯示:

$(function () {  var success = "<%=success %>";  if (success == "error") {   $(".g-body").hide();  } }) var iCount = setInterval(check, 2000); //每隔2秒執行一次check函數。 function check() {  $.ajax({   contentType: "application/json",   url: "/WebService/vinson.asmx/queryWeiXin",   data: "{OrderID:'" + $("#trade_no").text() + "'}",   type: "POST",   dataType: "json",   success: function (json) {    json = eval("(" + json.d + ")");    if (json.success == "success") {     clearInterval(iCount);     $(".m-weixin-money font").html("已成功付款");     $("#payQRImg").remove();     $(".m-weixin-demo").before('<img alt="" src="../images/wx_ok.jpg" width="200">');     $(".m-weixin-demo").next().remove();     $("#we_ok").show();    }   },   error: function (err, ex) {   }  }); }

是的,我又寫了個給ajax使用的查單函數queryWeiXin。

我這里才是生成訂單和二維碼:
恩,還有啥呢,恩,看看效果吧:

支付成功后:

原文鏈接:http://www.cnblogs.com/vinsonLu/p/5166214.html

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人天堂手机在线| 中文字幕欧美专区| 亚洲美女精品成人在线视频| 色妞在线综合亚洲欧美| 国产有码在线一区二区视频| 精品免费在线观看| 欧美一区二区色| 久久久久久久亚洲精品| 国产成人极品视频| 亚州国产精品久久久| 国产91在线播放九色快色| 久久精品成人动漫| 中文字幕精品在线视频| 日韩av在线最新| 久久久久久91香蕉国产| 亚洲黄页视频免费观看| 久久国产精品久久国产精品| 精品久久久久久久久久| 激情成人在线视频| 日韩成人在线免费观看| 日本精品久久中文字幕佐佐木| 日本国产一区二区三区| 国产成人av网址| 日韩精品免费一线在线观看| 日韩欧美精品网址| 91精品国产91久久久久久不卡| 午夜欧美不卡精品aaaaa| 亚洲另类欧美自拍| 国产自产女人91一区在线观看| 一区二区三区美女xx视频| 一区二区三区四区在线观看视频| 日韩美女写真福利在线观看| 日韩欧美在线字幕| 国产精品国产三级国产aⅴ浪潮| 色综合伊人色综合网站| 国产精品人成电影在线观看| 亚洲一区二区福利| 精品视频中文字幕| 国产精品免费福利| 欧美大秀在线观看| 成人黄色在线播放| www.日韩欧美| 91亚洲精品久久久| 亚洲成av人片在线观看香蕉| 中文字幕少妇一区二区三区| 日韩三级影视基地| 97精品视频在线| 日韩精品有码在线观看| 91影视免费在线观看| 国产美女扒开尿口久久久| 欧美日韩美女在线观看| 欧美极品少妇xxxxⅹ喷水| 亚洲白虎美女被爆操| 91色p视频在线| 国产精品中文字幕在线观看| 欧美亚洲午夜视频在线观看| 欧美黑人性生活视频| 久久久久久久av| 97在线观看视频| 国产精品永久免费在线| 福利视频一区二区| 亚洲欧美激情在线视频| 亚洲成人激情视频| 亚洲综合精品一区二区| 国产精品久久久久999| 久久久久久午夜| 亚洲热线99精品视频| 在线视频国产日韩| 欧美日韩国产精品一区二区三区四区| 日韩精品一二三四区| 国产精品入口免费视| 欧美猛交免费看| 国产精品日韩一区| 亚洲第一精品夜夜躁人人躁| www.日韩.com| 日韩亚洲欧美中文高清在线| 欧美一级成年大片在线观看| 国产精品成人久久久久| 欧美夫妻性生活xx| 欧美一区二区.| 亚洲第一网中文字幕| 久久久999精品视频| 这里只有精品视频在线| 18久久久久久| 中文日韩电影网站| 久久九九有精品国产23| 青青草一区二区| 欧美日韩中文在线观看| 国产999精品视频| 欧美精品18videos性欧| 久久夜色精品国产亚洲aⅴ| 国产精品一久久香蕉国产线看观看| 国产精品国产三级国产aⅴ浪潮| 亚洲国产又黄又爽女人高潮的| 久久久久久com| 欧美激情一区二区久久久| 欧美日韩成人网| 富二代精品短视频| 欧美精品国产精品日韩精品| 97视频在线播放| 色久欧美在线视频观看| 欧美贵妇videos办公室| 成人网在线免费观看| 欧美黑人性生活视频| 人人做人人澡人人爽欧美| 九九九热精品免费视频观看网站| 欧美日韩亚洲高清| 日韩av不卡在线| 久久深夜福利免费观看| 狠狠爱在线视频一区| 亚洲一区二区三区视频| 国产成人激情小视频| 日韩精品极品视频| 久久久久免费视频| 最新的欧美黄色| 九九久久精品一区| 成人欧美一区二区三区在线湿哒哒| 欧美大片免费观看在线观看网站推荐| 亚洲第一天堂av| 在线观看免费高清视频97| 日韩欧美在线国产| 另类专区欧美制服同性| 97精品国产97久久久久久春色| 国产丝袜一区二区三区免费视频| 欧美日韩成人精品| 中文字幕久久亚洲| 国产欧美欧洲在线观看| 高清一区二区三区四区五区| 社区色欧美激情 | 精品日韩视频在线观看| 蜜臀久久99精品久久久久久宅男| 美女福利视频一区| 亚洲欧美日韩天堂| 久久99久久久久久久噜噜| xxx成人少妇69| 成人春色激情网| 成人黄色av免费在线观看| 国产精品自拍小视频| 欧美福利小视频| 亚洲高清在线观看| 久久久女女女女999久久| 亚洲xxx视频| 精品久久久久久久中文字幕| 亚洲福利在线观看| 国语自产精品视频在线看| 欧美日韩在线看| 久久天天躁狠狠躁夜夜躁| 精品久久久久久久久久久久久久| 久久久久久久激情视频| 亚洲男人天堂2019| 成人网在线免费观看| 亚洲欧美日韩综合| 国产精品嫩草影院一区二区| 国产精品av免费在线观看| 成人黄色免费网站在线观看| 亚洲国产精品久久| 国产精品女视频| 欧美日韩国产成人高清视频| 国产精品国产三级国产专播精品人| 亚洲成人a**站| 夜夜躁日日躁狠狠久久88av| 久久人人爽人人爽爽久久| 亚洲日本成人网| 国产成人精品久久二区二区91|