天天看點

用c#開發微信 (22) 微信商城 - 微信支付 (c#源碼)

微信支付有幾種支付模式:刷卡支付,掃碼支付,公衆号支付,APP支付。本文介紹用于在微信商城裡的公衆号支付。

1. 效果圖

在商城裡購買商品後,到支付頁面:

用c#開發微信 (22) 微信商城 - 微信支付 (c#源碼)

點選上面的确認支付,轉到下面微信支付頁面:

用c#開發微信 (22) 微信商城 - 微信支付 (c#源碼)

可關注微信号 webuscn 或掃描下面二維碼,進入微商城體驗:

作者:瘋吻IT 出處:http://fengwenit.cnblogs.com

2. 申請微信支付

申請成為公衆賬号支付商戶需要滿足以下條件:

1、擁有公衆帳号,且為服務号、企業号;

2、公衆帳号須通過微信認證;(未認證使用者,可先申請微信認證)

3、政府、媒體兩大類型的訂閱号支援申請微信支付(點此了解更多)。

4、企業号也支援申請微信支付,請在企業号管理平台發起申請。

溫馨提示:

1、微信支付商戶申請無開通費用及保證金;

2、微信認證資質稽核通過後,即可申請微信支付功能;

3、訂閱号可先更新為服務号,更新方法點選這裡了解。

詳細步驟請參考官方文檔:

http://kf.qq.com/faq/140225MveaUz150107UVFNjy.html

3.  實作

3.1 配置

首先要配置支付授權目錄:

用c#開發微信 (22) 微信商城 - 微信支付 (c#源碼)

在你的微商城系統裡配置商戶資訊:

用c#開發微信 (22) 微信商城 - 微信支付 (c#源碼)

3.2 前台代碼

這個頁面就是上面配置的支付授權目錄下面的頁面。

先定義一個支付按鈕:

<a href="javascript:void(0);" class="btn" id="getBrandWCPayRequest">确認支付</a>      

當微信内置浏覽器完成内部初始化後會觸發WeixinJSBridgeReady事件:

document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {      
//公衆号支付      
jQuery('a#getBrandWCPayRequest').click(function (e) {      
WeixinJSBridge.invoke('getBrandWCPayRequest', {      
<%=packageValue%>      
}, function (res) {      
var newurl = "/api/payment/wxpay/payResult.aspx?wid=" + <%=wid%> + "&otid=" + '<%=otid_str%>' + "&openid=" + '<%=openid%>' + "";      
if (res.err_msg == "get_brand_wcpay_request:ok") {      
//支付成功後清空我的訂單      
$.post("/shop/shopmgr.ashx?myact=clearMyOrder", { wid: '<%=wid%>', openid: '<%=openid%>' }, function (data) { }, "json")      
alert("微信支付成功,點選右上角傳回!");      
window.location.href = newurl;      
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {      
alert("您取消了支付!");      
} else {      
alert(res.err_msg);      
alert("您支付失敗了!");      
}      
});      
});      
WeixinJSBridge.log('yo~ ready.');      
}, false);      

使用以上方式判斷前端傳回,微信團隊鄭重提示:res.err_msg将在使用者支付成功後傳回ok,但并不保證它絕對可靠。

是以微信團隊建議,當收到ok傳回時,向商戶背景詢問是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此時未收到通知,商戶背景主動調用查詢訂單接口,查詢訂單的目前狀态,并回報給前端展示相應的界面。

網頁端接口參數詳細清單:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7

3.3 背景代碼

主要是生成前台所需要的 packageValue :

//先設定基本資訊      
string MchId = paymentInfo.partnerId; // "1218574001";//        
string partnerKey = paymentInfo.partnerKey;// 商戶支付密鑰Key。登入微信商戶背景,進入欄目【賬戶設定】【密碼安全】【API 安全】【API 密鑰】      
string notify_url = "http://" + HttpContext.Current.Request.Url.Authority + "/api/payment/wxpay/notify_url.aspx";      
string timeStamp = "";      
string nonceStr = "";      
string paySign = "";      
string sp_billno = out_trade_no;      
//目前時間 yyyyMMdd      
string date = DateTime.Now.ToString("yyyyMMdd");      
if (null == sp_billno)      
{      
//生成訂單10位序列号,此處用時間和随機數生成,商戶根據自己調整,保證唯一      
sp_billno = DateTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(28);      
}      
//建立支付應答對象      
Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);      
//初始化      
packageReqHandler.Init();      
//packageReqHandler.SetKey(""/*TenPayV3Info.Key*/);      
timeStamp = TenPayV3Util.GetTimestamp();      
nonceStr = TenPayV3Util.GetNoncestr();      
//設定package訂單參數      
packageReqHandler.SetParameter("appid", uwEntity.AppId);          //公衆賬号ID      
packageReqHandler.SetParameter("mch_id", MchId);          //商戶号      
packageReqHandler.SetParameter("nonce_str", nonceStr);                    //随機字元串      
packageReqHandler.SetParameter("body", busiBody);  //商品描述      
packageReqHandler.SetParameter("attach", wid + "|" + busiBody);      
packageReqHandler.SetParameter("out_trade_no", sp_billno);        //商家訂單号      
packageReqHandler.SetParameter("total_fee", ((int)(ttFee * 100)).ToString());                    //商品金額,以分為機關(money * 100).ToString()      
packageReqHandler.SetParameter("spbill_create_ip", Request.UserHostAddress);   //使用者的公網ip,不是商戶伺服器IP      
packageReqHandler.SetParameter("notify_url", notify_url);            //接收财付通通知的URL      
packageReqHandler.SetParameter("trade_type", TenPayV3Type.JSAPI.ToString());//交易類型      
packageReqHandler.SetParameter("openid", openid);                        //使用者的openId      
string sign = packageReqHandler.CreateMd5Sign("key", partnerKey);      
packageReqHandler.SetParameter("sign", sign);                        //簽名      
string data = packageReqHandler.ParseXML();      
var result = TenPayV3.Unifiedorder(data);      
var res = XDocument.Parse(result);      
prepayId = res.Element("xml").Element("prepay_id").Value;      
//設定支付參數      
Senparc.Weixin.MP.TenPayLibV3.RequestHandler paySignReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);      
paySignReqHandler.SetParameter("appId", uwEntity.AppId);      
paySignReqHandler.SetParameter("timeStamp", timeStamp);      
paySignReqHandler.SetParameter("nonceStr", nonceStr);      
paySignReqHandler.SetParameter("package", string.Format("prepay_id={0}", prepayId));      
paySignReqHandler.SetParameter("signType", "MD5");      
paySign = paySignReqHandler.CreateMd5Sign("key", partnerKey);      
packageValue = "";      
packageValue += " \"appId\": \"" + uwEntity.AppId + "\", ";      
packageValue += " \"timeStamp\": \"" + timeStamp + "\", ";      
packageValue += " \"nonceStr\": \"" + nonceStr + "\", ";      
packageValue += " \"package\": \"" + string.Format("prepay_id={0}", prepayId) + "\", ";      
packageValue += " \"signType\": \"MD5\", ";      
packageValue += " \"paySign\": \"" + paySign + "\"";      

用c#開發微信 系列彙總

線上教學、視訊會議(含 文本、語音、視訊聊天、電子白闆)

繼續閱讀