微信支付有幾種支付模式:刷卡支付,掃碼支付,公衆号支付,APP支付。本文介紹用于在微信商城裡的公衆号支付。
1. 效果圖
在商城裡購買商品後,到支付頁面:

點選上面的确認支付,轉到下面微信支付頁面:
可關注微信号 webuscn 或掃描下面二維碼,進入微商城體驗:
作者:瘋吻IT 出處:http://fengwenit.cnblogs.com
2. 申請微信支付
申請成為公衆賬号支付商戶需要滿足以下條件:
1、擁有公衆帳号,且為服務号、企業号;
2、公衆帳号須通過微信認證;(未認證使用者,可先申請微信認證)
3、政府、媒體兩大類型的訂閱号支援申請微信支付(點此了解更多)。
4、企業号也支援申請微信支付,請在企業号管理平台發起申請。
溫馨提示:
1、微信支付商戶申請無開通費用及保證金;
2、微信認證資質稽核通過後,即可申請微信支付功能;
3、訂閱号可先更新為服務号,更新方法點選這裡了解。
詳細步驟請參考官方文檔:
http://kf.qq.com/faq/140225MveaUz150107UVFNjy.html
3. 實作
3.1 配置
首先要配置支付授權目錄:
在你的微商城系統裡配置商戶資訊:
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#開發微信 系列彙總
線上教學、視訊會議(含 文本、語音、視訊聊天、電子白闆) |