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

首頁(yè) 微信小程序 微信開(kāi)發(fā) 微信公眾號(hào)開(kāi)發(fā)之微信支付

微信公眾號(hào)開(kāi)發(fā)之微信支付

Feb 22, 2017 pm 04:02 PM
微信公眾號(hào)

  前幾天因?yàn)楣卷?xiàng)目需求,要做一個(gè)用微信在線充值的功能,就是在微信的瀏覽器里面點(diǎn)擊一個(gè)網(wǎng)頁(yè)調(diào)起微信支付,現(xiàn)在大致來(lái)說(shuō)一下微信支付之公眾號(hào)支付的開(kāi)發(fā)流程:

  首先你的公眾號(hào)必須是認(rèn)證服務(wù)號(hào),要開(kāi)通了微信支付的權(quán)限;在開(kāi)發(fā)寫(xiě)代碼之前我們要把支付相關(guān)的一些信息設(shè)置做好,以利于后續(xù)操作,開(kāi)通之后微信那邊就會(huì)給你發(fā)一封郵件,里面包含了你公眾號(hào)商戶平臺(tái)的后臺(tái)登陸相關(guān)的一些信息,登陸商戶平臺(tái)之后在->賬戶設(shè)置->API安全里面設(shè)置密鑰,這個(gè)在后面會(huì)用到;

微信公眾號(hào)開(kāi)發(fā)之微信支付

賬戶參數(shù)說(shuō)明


郵件中參數(shù) API參數(shù)名 詳細(xì)說(shuō)明
APPID appid appid是微信公眾賬號(hào)或開(kāi)放平臺(tái)APP的唯一標(biāo)識(shí),在公眾平臺(tái)申請(qǐng)公眾賬號(hào)或者在開(kāi)放平臺(tái)申請(qǐng)APP賬號(hào)后,微信會(huì)自動(dòng)分配對(duì)應(yīng)的appid,用于標(biāo)識(shí)該應(yīng)用。商戶的微信支付審核通過(guò)郵件中也會(huì)包含該字段值。
微信支付商戶號(hào) mch_id 商戶申請(qǐng)微信支付后,由微信支付分配的商戶收款賬號(hào)。
API密鑰 key 交易過(guò)程生成簽名的密鑰,僅保留在商戶系統(tǒng)和微信支付后臺(tái),不會(huì)在網(wǎng)絡(luò)中傳播。商戶妥善保管該Key,切勿在網(wǎng)絡(luò)中傳輸,不能在其他客戶端中存儲(chǔ),保證key不會(huì)被泄漏。商戶可根據(jù)郵件提示登錄微信商戶平臺(tái)進(jìn)行設(shè)置。
Appsecret secret AppSecret是APPID對(duì)應(yīng)的接口密碼,用于獲取接口調(diào)用憑證access_token時(shí)使用。在微信支付中,先通過(guò)OAuth2.0接口獲取用戶openid,此openid用于微信內(nèi)網(wǎng)頁(yè)支付模式下單接口使用。在開(kāi)發(fā)模式中獲取AppSecret(成為開(kāi)發(fā)者且?guī)ぬ?hào)沒(méi)有異常狀態(tài))。


?

  這些完成之后我們還要了解一下公眾號(hào)支付的一個(gè)業(yè)務(wù)流程:

微信公眾號(hào)開(kāi)發(fā)之微信支付

?

?

商戶系統(tǒng)和微信支付系統(tǒng)主要交互:

1.商戶server調(diào)用統(tǒng)一下單接口請(qǐng)求訂單,api參見(jiàn)公共api【統(tǒng)一下單API】;在請(qǐng)求預(yù)支付訂單之前我們要調(diào)用微信OAuth2.0網(wǎng)頁(yè)授權(quán)獲取用戶微信OpenId,這里就不詳細(xì)說(shuō)明了,下面是預(yù)支付下單的代碼實(shí)現(xiàn):

string timeStamp = TenPayUtil.GetTimestamp();
                string nonceStr = TenPayUtil.GetNoncestr();
                string paySign = string.Empty;

                //創(chuàng)建支付應(yīng)答對(duì)象
                var packageReqHandler = new RequestHandler(null);

                string spbill_create_ip = Request.UserHostAddress;

                //初始化
                //packageReqHandler.Init();
                //packageReqHandler.SetKey(TenPayInfo.Key);
                //設(shè)置package訂單參數(shù)
                packageReqHandler.SetParameter("appid", appID); //公眾賬號(hào)ID
                packageReqHandler.SetParameter("body", StrUtil.GetCutString(productName, 100)); //不能超過(guò)127個(gè)字符
                packageReqHandler.SetParameter("mch_id", mchid); //商戶號(hào)
                packageReqHandler.SetParameter("nonce_str", nonceStr.ToLower()); //隨機(jī)字符串
                packageReqHandler.SetParameter("notify_url", notifyUrl); //接收財(cái)付通通知的URL
                packageReqHandler.SetParameter("openid", openId); //openid
                packageReqHandler.SetParameter("out_trade_no", sp_billno); //商家訂單號(hào)
                // packageReqHandler.SetParameter("attach", "");          //附加數(shù)據(jù)  未來(lái)可用于區(qū)分不同微信支付業(yè)務(wù)
                packageReqHandler.SetParameter("spbill_create_ip", spbill_create_ip); //用戶的公網(wǎng)ip,不是商戶服務(wù)器IP
                packageReqHandler.SetParameter("total_fee", (onlinePayMoney * 100).ToString("0")); //商品金額,以分為單位(money * 100).ToString()
                packageReqHandler.SetParameter("trade_type", "JSAPI"); //交易類型

                //獲取package包
                string sign = packageReqHandler.CreateMd5Sign("key", TenPayInfo.Key);
                packageReqHandler.SetParameter("sign", sign); //交易類型
                string data = packageReqHandler.ParseXML();
                LoggerHelper.Log(data);
                
                //調(diào)用統(tǒng)一下單接口請(qǐng)求訂單
                var result = TenPayV3Service.Unifiedorder(data);
                LoggerHelper.Log(result);

                var res = XDocument.Parse(result);

                string prepayId = string.Empty;
                if (res.Element("xml").Element("return_code").Value == "SUCCESS")
                {
                    prepayId = res.Element("xml").Element("prepay_id").Value;
                }

                string package = string.Format("prepay_id={0}", prepayId);
                timeStamp = TenPayUtil.GetTimestamp();

                //設(shè)置支付參數(shù)
                var paySignReqHandler = new RequestHandler(null);
                paySignReqHandler.SetParameter("appId", appID);
                paySignReqHandler.SetParameter("timeStamp", timeStamp);
                paySignReqHandler.SetParameter("nonceStr", nonceStr);
                paySignReqHandler.SetParameter("package", package);
                paySignReqHandler.SetParameter("signType", "MD5");
                paySign = paySignReqHandler.CreateMd5Sign("key", TenPayInfo.Key);

                //將信息傳遞給支付頁(yè)面
                ViewBag.appId = appID;
                ViewBag.timeStamp = timeStamp;
                ViewBag.nonceStr = nonceStr;
                ViewBag.package = package;
                ViewBag.paySign = paySign;


下面是頁(yè)面js相關(guān)代碼:


<script type="text/javascript">        // 當(dāng)微信內(nèi)置瀏覽器完成內(nèi)部初始化后會(huì)觸發(fā)WeixinJSBridgeReady事件。
        document.addEventListener(&#39;WeixinJSBridgeReady&#39;, function onBridgeReady() {
            $(function () {                //公眾號(hào)支付
                jQuery(&#39;#getBrandWCPayRequest&#39;).click(function (e) {
                    WeixinJSBridge.invoke(&#39;getBrandWCPayRequest&#39;, {                        "appId": "@ViewBag.appId", //公眾號(hào)名稱
                        "timeStamp": "@ViewBag.timeStamp", //時(shí)間戳
                        "nonceStr": "@ViewBag.nonceStr", //隨機(jī)串
                        "package": "@Html.Raw(ViewBag.package.ToString())",//擴(kuò)展包
                        "signType": "MD5", //微信簽名方式
                        "paySign": "@ViewBag.paySign" //微信簽名                    }, function (res) {                        if (res.err_msg == "get_brand_wcpay_request:ok") {                            //alert("微信支付成功!");
                            window.location.href = "@WxPaySettingConfig.WmallURL/Wmall/TradePay/Success/@ViewBag.ShopId/?orderNo=@orderNoMark";
                        }                        else if (res.err_msg == "get_brand_wcpay_request:cancel") {                            //alert("用戶取消支付!");                        }                        else {
                            window.location.href = "/wxpay/jsapi/error/?isPayFail=1&csid=@ViewBag.ShopId&orderNo=@orderNoMark&biztype=1";    
                        }                        // 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對(duì)可靠。                        //因此微信團(tuán)隊(duì)建議,當(dāng)收到ok返回時(shí),向商戶后臺(tái)詢問(wèn)是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此時(shí)未收到通知,商戶后臺(tái)主動(dòng)調(diào)用查詢訂單接口,查詢訂單的當(dāng)前狀態(tài),并反饋給前端展示相應(yīng)的界面。                    });
                });
            });            //WeixinJSBridge.log(&#39;yo~ ready.&#39;);
        }, false);    </script>


2.商戶server接收支付通知,api參見(jiàn)公共api【支付結(jié)果通知API

[HttpPost]
        public void NoticeUrl()
        {
            string xmlString = HttpClientHelper.GetPostString(Request);  5 
            //此處應(yīng)記錄日志
            LoggerHelper.Log(string.Format("【微支付】異步通知參數(shù):{0}", xmlString));  8 
            var returnMsg = new ReturnMessage() { Return_Code = "SUCCESS", Return_Msg = string.Empty };
            //通知消息實(shí)體
            NotifyMessage message = null;
            //訂單處理相關(guān)的方法內(nèi)全局變量
            bool isNeedDeal = false; //標(biāo)識(shí)訂單是否需要處理
            string orderNo = string.Empty; //訂單編號(hào) (需要根據(jù)商家數(shù)據(jù)包字段判斷所屬訂單)
            CorpSalesOrder saleOrder = null;
            try
            {
                message = HttpClientHelper.XmlDeserialize<NotifyMessage>(xmlString);
 
                //訂單號(hào) 獲得
                orderNo = message.Out_Trade_No;
                if (string.IsNullOrEmpty(orderNo))
                {
                    throw new InvalidOperationException("未找到該訂單信息.");
                } 45                 var doc = new XmlDocument();
                doc.LoadXml(xmlString);
                var dic = new Dictionary<string, string>();
                string sign = string.Empty;
                foreach (XmlNode node in doc.FirstChild.ChildNodes)
                {
                    if (node.Name.ToLower() != "sign")
                        dic.Add(node.Name, node.InnerText);
                    else
                        sign = node.InnerText;
                }
                UnifiedWxPayModel model = UnifiedWxPayModel.CreateUnifiedModel(xddAppId, xddMchid, xddWxkey);
                if (model.ValidateMD5Signature(dic, sign))
                {
                    //處理通知 業(yè)務(wù)邏輯:
                    if (message.Return_Code == "SUCCESS")
                    {
                        if (message.Result_Code == "SUCCESS")
                        {
                   //此處處理支付成功后的業(yè)務(wù)邏輯
                        }
                        else
                        {
                            throw new InvalidOperationException(string.Format("{0}:{1}", message.Err_Code, message.Err_Code_Des));
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException(message.Return_Msg);
                    }
                }
            }
            catch (InvalidOperationException e)
            {
                //此處記錄異常日志
                returnMsg.Return_Code = "FAIL";
                returnMsg.Return_Msg = e.Message;
                LoggerHelper.Log("【微信支付異步通知】出錯(cuò),訂單編號(hào):" + orderNo + ",錯(cuò)誤原因:" + e.Message);
            }
            catch (Exception e)
            {
                //此處記錄異常日志
                returnMsg.Return_Code = "FAIL";
                returnMsg.Return_Msg = e.Message;
                LoggerHelper.Log("【微信支付異步通知】出錯(cuò),訂單編號(hào):" + orderNo + ",錯(cuò)誤原因:" + (e.InnerException == null ? e.Message : e.InnerException.ToString()));
            }
            Response.Write(returnMsg.ToXmlString());
            Response.End();
        }

更多微信公眾號(hào)開(kāi)發(fā)之微信支付?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!


本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系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脫衣機(jī)

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集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1597
29
PHP教程
1488
72
Scrapy實(shí)現(xiàn)微信公眾號(hào)文章爬取和分析 Scrapy實(shí)現(xiàn)微信公眾號(hào)文章爬取和分析 Jun 22, 2023 am 09:41 AM

Scrapy實(shí)現(xiàn)微信公眾號(hào)文章爬取和分析微信是近年來(lái)備受歡迎的社交媒體應(yīng)用,在其中運(yùn)營(yíng)的公眾號(hào)也扮演著非常重要的角色。眾所周知,微信公眾號(hào)是一個(gè)信息和知識(shí)的海洋,因?yàn)槠渲忻總€(gè)公眾號(hào)都可以發(fā)布文章、圖文消息等信息。這些信息可以被廣泛地應(yīng)用在很多領(lǐng)域中,比如媒體報(bào)道、學(xué)術(shù)研究等。那么,本篇文章將介紹如何使用Scrapy框架來(lái)實(shí)現(xiàn)微信公眾號(hào)文章的爬取和分析。Scr

微信公眾號(hào)認(rèn)證和不認(rèn)證有哪些區(qū)別 微信公眾號(hào)認(rèn)證和不認(rèn)證有哪些區(qū)別 Sep 19, 2023 pm 02:15 PM

微信公眾號(hào)認(rèn)證和不認(rèn)證的區(qū)別在認(rèn)證標(biāo)識(shí)、功能權(quán)限、推送頻率、接口權(quán)限和用戶信任度等方面。詳細(xì)介紹:1、認(rèn)證標(biāo)識(shí),認(rèn)證公眾號(hào)會(huì)獲得官方頒發(fā)的認(rèn)證標(biāo)識(shí),即藍(lán)色V標(biāo)志,這個(gè)標(biāo)志可以增加公眾號(hào)的可信度和權(quán)威性,讓用戶更容易辨別真實(shí)的官方公眾號(hào);2、功能權(quán)限,認(rèn)證公眾號(hào)相比未認(rèn)證的公眾號(hào)擁有更多的功能和權(quán)限,例如認(rèn)證公眾號(hào)可以申請(qǐng)開(kāi)通微信支付功能,實(shí)現(xiàn)在線支付和商業(yè)化運(yùn)營(yíng)等等。

Python中的爬蟲(chóng)實(shí)戰(zhàn):微信公眾號(hào)爬蟲(chóng) Python中的爬蟲(chóng)實(shí)戰(zhàn):微信公眾號(hào)爬蟲(chóng) Jun 10, 2023 am 09:01 AM

Python是一種優(yōu)雅的編程語(yǔ)言,擁有強(qiáng)大的數(shù)據(jù)處理和網(wǎng)絡(luò)爬蟲(chóng)功能。在這個(gè)數(shù)字化時(shí)代,互聯(lián)網(wǎng)上充滿了大量的數(shù)據(jù),爬蟲(chóng)已成為獲取數(shù)據(jù)的重要手段,因此,Python爬蟲(chóng)在數(shù)據(jù)分析和挖掘方面有著廣泛的應(yīng)用。在本文中,我們將介紹如何使用Python爬蟲(chóng)來(lái)獲取微信公眾號(hào)文章信息。微信公眾號(hào)是一種流行的社交媒體平臺(tái),用于在線發(fā)布文章,是許多公司和自媒體推廣和營(yíng)銷(xiāo)的重要工

用PHP構(gòu)建一個(gè)微信公眾號(hào)API接口 用PHP構(gòu)建一個(gè)微信公眾號(hào)API接口 May 13, 2023 pm 12:01 PM

在當(dāng)今互聯(lián)網(wǎng)時(shí)代,微信公眾號(hào)成為了越來(lái)越多企業(yè)的重要營(yíng)銷(xiāo)渠道。想要自己的微信公眾號(hào)實(shí)現(xiàn)更多的功能,常常需要編寫(xiě)相應(yīng)的接口。本文將以PHP語(yǔ)言為例,介紹如何構(gòu)建一個(gè)微信公眾號(hào)API接口。一、前置準(zhǔn)備在編寫(xiě)微信公眾號(hào)API接口之前,需要開(kāi)發(fā)者擁有一個(gè)微信公眾號(hào)的賬號(hào),并且在微信公眾平臺(tái)中申請(qǐng)開(kāi)發(fā)者接口權(quán)限。申請(qǐng)成功后,可以獲取到相關(guān)的開(kāi)發(fā)者AppID和AppSe

如何使用Laravel開(kāi)發(fā)一個(gè)基于微信公眾號(hào)的在線點(diǎn)餐系統(tǒng) 如何使用Laravel開(kāi)發(fā)一個(gè)基于微信公眾號(hào)的在線點(diǎn)餐系統(tǒng) Nov 02, 2023 am 09:42 AM

如何使用Laravel開(kāi)發(fā)一個(gè)基于微信公眾號(hào)的在線點(diǎn)餐系統(tǒng)隨著微信公眾號(hào)的廣泛應(yīng)用,越來(lái)越多的企業(yè)開(kāi)始將其作為在線營(yíng)銷(xiāo)的重要渠道。在餐飲行業(yè)中,開(kāi)發(fā)一個(gè)基于微信公眾號(hào)的在線點(diǎn)餐系統(tǒng)能夠提高企業(yè)的效率和銷(xiāo)售額。本文將介紹如何使用Laravel框架來(lái)開(kāi)發(fā)一個(gè)這樣的系統(tǒng),并提供具體的代碼示例。項(xiàng)目準(zhǔn)備首先,需要確保已經(jīng)在本地環(huán)境中安裝好了Laravel框架??梢酝?/p>

公眾號(hào)每天只能發(fā)一篇文章嗎 公眾號(hào)每天只能發(fā)一篇文章嗎 Jun 16, 2023 pm 02:04 PM

公眾號(hào)每天不是只能發(fā)一篇文章,每次最多可以發(fā)表八篇文章,多篇文章的發(fā)布方法:1、點(diǎn)擊左側(cè)的“素材管理”,再點(diǎn)擊“新建圖文素材”開(kāi)始編輯第一篇文章;2、編輯完第一篇文章之后,點(diǎn)擊左側(cè)第一篇文章下面的+號(hào),點(diǎn)擊“圖文消息”即可編輯第二篇文章;3、做完多圖文后,點(diǎn)擊“保管并群發(fā)”即可完成多篇文章的發(fā)布。

使用Go語(yǔ)言框架構(gòu)建微信公眾號(hào)應(yīng)用 使用Go語(yǔ)言框架構(gòu)建微信公眾號(hào)應(yīng)用 Jun 04, 2023 am 10:40 AM

隨著互聯(lián)網(wǎng)的普及和移動(dòng)設(shè)備的廣泛使用,微信公眾號(hào)已經(jīng)成為了企業(yè)營(yíng)銷(xiāo)必不可少的一部分。通過(guò)微信公眾號(hào),企業(yè)可以實(shí)現(xiàn)輕松地與用戶互動(dòng),推廣產(chǎn)品和服務(wù),提高品牌知名度。為了更好地開(kāi)發(fā)微信公眾號(hào)應(yīng)用,越來(lái)越多的開(kāi)發(fā)者和企業(yè)選擇使用Go語(yǔ)言來(lái)構(gòu)建微信公眾號(hào)應(yīng)用。Go語(yǔ)言是一種由Google開(kāi)發(fā)的編程語(yǔ)言,它的語(yǔ)法簡(jiǎn)潔,適合構(gòu)建高性能、高并發(fā)的實(shí)時(shí)應(yīng)用程序。在簡(jiǎn)單易用和

微信宣布規(guī)范'封建迷信風(fēng)氣,借宗教、風(fēng)水、運(yùn)勢(shì)等噱頭斂財(cái)或博取關(guān)注”內(nèi)容 微信宣布規(guī)范'封建迷信風(fēng)氣,借宗教、風(fēng)水、運(yùn)勢(shì)等噱頭斂財(cái)或博取關(guān)注”內(nèi)容 Aug 05, 2024 pm 10:26 PM

本站8月1日消息,微信公眾平臺(tái)運(yùn)營(yíng)中心今日發(fā)文稱,平臺(tái)發(fā)現(xiàn)部分運(yùn)營(yíng)者發(fā)布的文章中存在封建迷信風(fēng)氣,借宗教、風(fēng)水、運(yùn)勢(shì)等噱頭斂財(cái)或博取關(guān)注,此類內(nèi)容極有可能對(duì)用戶造成誤導(dǎo)或財(cái)產(chǎn)損失。微信方面將采取持續(xù)巡查,一旦發(fā)現(xiàn)違規(guī)內(nèi)容將根據(jù)具體違規(guī)程度作出相應(yīng)處理。本站附違規(guī)案例如下:發(fā)布迷信類相關(guān)標(biāo)題,使用恐嚇、誘導(dǎo)等語(yǔ)氣夸大某行為的危害或負(fù)面影響。▲圖源微信公眾平臺(tái)運(yùn)營(yíng)中心,下同文章提供算命、看相、占卜等帶封建迷信色彩服務(wù),并含付費(fèi)項(xiàng)目,如售賣(mài)轉(zhuǎn)運(yùn)消災(zāi)商品等。借提供相關(guān)服務(wù)的名義不正當(dāng)?shù)夭杉脩魝€(gè)人隱私信

See all articles