摘要:這幾天在做小程序的支付,沒有用官方的,這里就純用官方的文檔搞一發(fā)。
這幾天在做小程序的支付,沒有用官方的SDK,這里就純用官方的文檔搞一發(fā)。
* 注作者使用的PHP,不過支付流程都是這樣
開發(fā)前必讀 主要流程小程序前端發(fā)送求參請(qǐng)求
接受請(qǐng)求封裝 “統(tǒng)一下單” 獲取package
小程序接受 “統(tǒng)一下單” 獲取的package值帶入wx.requestPayment發(fā)起支付請(qǐng)求
準(zhǔn)備工具申請(qǐng)小程序微信支付
拿到小程序微信支付的商戶號(hào)及設(shè)置秘鑰
注意:小程序就只需要這兩步,如果是web的話還需要設(shè)置支付目錄授權(quán)域名,文檔里面也有寫的:https://pay.weixin.qq.com/wik...
官方文檔:https://pay.weixin.qq.com/wik...
/** * 統(tǒng)一訂單 */ public function unifiedorder(){ // 以下配置是必填項(xiàng),如有其它需求請(qǐng)自行配置 $config = array( "appid" => "xxxxxxx",//這里是小程序appid "mch_id" => "xxxxxxx",//商戶ID "nonce_str" => $this->getNonceStr(),//隨機(jī)字符串 "body" => "這里是測(cè)試 - 測(cè)試",//請(qǐng)按照文檔要求填寫合格名稱 "out_trade_no" => time().$this->getNonceStr(2),//流水單號(hào) "total_fee" => "20",//金額,分為單位,這里是0.2元 "spbill_create_ip" => "123.123.123.123",//當(dāng)前IP "notify_url" => "http://xxxx.com",//請(qǐng)恕我愚昧,我沒搞懂他有什么用 "trade_type" => "JSAPI",//必須填寫JSAPI "openid" => "xxxxxxxx"http://當(dāng)前用戶的openid,在trade_type=JSAPI的時(shí)候,此項(xiàng)就變成必填項(xiàng)了 ); $config["sign"] = $this->getSignPay($config); $xmlData = $this->ToXml($config);//轉(zhuǎn)成xml數(shù)據(jù) $postData = $this->http_post($xmlData); $arrayData = $this->FromXml($postData); if($arrayData["return_code"] == "SUCCESS" || $arrayData["result_code"] == "SUCCESS"){ return $arrayData["prepay_id"];//重點(diǎn)來了:走了這么多路,就為了這個(gè)值。到這一步就證明成功一多半了。 }else{ return $arrayData;//返回錯(cuò)誤 } } /** * 獲取簽名 */ public function getSignPay($config){ $key = "xxxxxxx";//商戶秘鑰,就是自己生成的32位密碼 $strA = "appid=".$config["appid"]."&body=".$config["body"]."&mch_id=".$config["mch_id"]."&nonce_str=".$config["nonce_str"]."¬ify_url=".$config["notify_url"]."&spbill_create_ip".$config["spbill_create_ip"]."&total_fee=".$config["total_fee"]."&trade_type=".$config["trade_type"];//ASCII 字典序 $strB = $strA."&key=".$key; $sign = strtoupper(md5($strB));//大寫MD5 return $sign; } /** * 隨機(jī)字符串 32位 */ public function getNonceStr($length = 32){ $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } /** * array轉(zhuǎn)XML */ public function ToXml($data){ if(!is_array($data) || count($data) <= 0){ throw new WxPayException("數(shù)組數(shù)據(jù)異常!"); } $xml = ""; foreach ($data as $key=>$val){ $xml.="<".$key.">".$val."".$key.">"; } $xml.=" "; return $xml; } /** * xml轉(zhuǎn)array */ public function FromXml($xml){ if(!$xml){ throw new WxPayException("xml數(shù)據(jù)異常!"); } libxml_disable_entity_loader(true); $this->values = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true); return $this->values; } /** * post 請(qǐng)求 */ public function http_post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (PHP_VERSION_ID >= 50500 && class_exists("CURLFile")) { $is_curlFile = true; } else { $is_curlFile = false; if (defined("CURLOPT_SAFE_UPLOAD")) { curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false); } } if (is_string($param)) { $strPOST = $param; }elseif($post_file) { if($is_curlFile) { foreach ($param as $key => $val) { if (substr($val, 0, 1) == "@") { } } } $strPOST = $param; } else { $aPOST = array(); foreach($param as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&", $aPOST); } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } }
好了現(xiàn)在已經(jīng)獲取到了 prepay_id 的值,我們的統(tǒng)一下單就算完成了,其實(shí)我更樂意叫他數(shù)據(jù)封裝
官方文檔:https://developers.weixin.qq....
先來一個(gè)插曲,首先我們小程序的前端需要去觸發(fā)pay,實(shí)現(xiàn)的功能肯定是要點(diǎn)擊小程序的一個(gè)觸發(fā),然后才能支付對(duì)吧,
pay:function(e){ //這里面使用post去請(qǐng)求。然后通過我接下來要寫的API支付代碼獲取小程序支付參數(shù) success:function(res){ wx.requestPayment({ "timeStamp":toString(res.timeStamp),//這里轉(zhuǎn)字符串,這里被坑過,不轉(zhuǎn)的話可能會(huì)出現(xiàn)total_fee為空 "nonceStr":toString(res.nonceStr), "package":toString(res.package), "signType":"MD5", "paySign":toString(res.paySign), success:function(res){ console.log(res);//這里可以跳轉(zhuǎn)到帶參地址 }, fail:function(res){ console.info("支付失敗",res); }, complete:function(){ console.info("支付觸發(fā)回調(diào)",res); } }) } }api支付
也就是上面小程序代碼的后端請(qǐng)求地址
/** * api組裝數(shù)據(jù) */ public function payApiBlack(){ $appid = "xxxxxx";//小程序appid,上面有重復(fù),不過這樣比較直觀 $timeStamp = time(); $nonceStr = $this->getNonceStr();//這是調(diào)用統(tǒng)一下單里面的方法,為了直觀,我把這些代碼都寫在了一個(gè)類里 $package = "prepay_id=".$this->unifiedorder(); $signType = "MD5"; $key = "xxxxxx";//這里是商戶秘鑰,32位,同上面也有 $strA = "appId=".$appid."&nonceStr=".$nonceStr."package=".$package."&= signType=".$signType."&timeStamp=".$timeStamp."&key=".$key; $paySign = strtoupper(md5($strA)); $data = array( "appid"=>$appid, "timeStamp"=>$timeStamp, "nonceStr"=>$nonceStr, "package"=>$package, "signType"=>$signType ); return $data;//返回給小程序 }
以上就是全部代碼,還有小程序的支付回調(diào)沒有什么信息,所以,我的思路判斷success后進(jìn)行跳轉(zhuǎn)帶參
//此代碼為wx.requestPayment success,部分代碼省略 //res 回調(diào)參數(shù)包括用戶uid及其他重要傳遞 success:function(res){ wx.redirect({ url:"pages/pay/done?uid="+res.uid }) }
當(dāng)然那個(gè)統(tǒng)一下單的 notify_url 好像與回調(diào)有關(guān),至于怎么用,試了幾次回調(diào)的CURD都沒反應(yīng),所以有空再研究啦。
以上代碼僅作為支付流程解釋,所以真正要用到項(xiàng)目上,還是去套官方的SDK吧,畢竟涉及到錢嘛
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/29155.html
摘要:零售商家通過微信支付小程序?qū)崿F(xiàn)線上線下消費(fèi)一體化,通過線上支付線下單品完成商品數(shù)據(jù)的打通。因此小程序搭載智慧零售,能助力商家實(shí)現(xiàn)消費(fèi)場(chǎng)景數(shù)字化以及購買行為具象化,從新的維度提高用戶服務(wù)水平。 隨著移動(dòng)互聯(lián)網(wǎng)、大數(shù)據(jù)、AI等技術(shù)日益成熟,實(shí)體行業(yè)領(lǐng)域的轉(zhuǎn)型成為業(yè)績(jī)提升的關(guān)鍵。對(duì)于零售行業(yè)從業(yè)者,這意味著思維方式的自我進(jìn)化,對(duì)于消費(fèi)者,則意味著與產(chǎn)品產(chǎn)生新的連接,享受更加個(gè)性化、更具人情味...
摘要:零售商家通過微信支付小程序?qū)崿F(xiàn)線上線下消費(fèi)一體化,通過線上支付線下單品完成商品數(shù)據(jù)的打通。因此小程序搭載智慧零售,能助力商家實(shí)現(xiàn)消費(fèi)場(chǎng)景數(shù)字化以及購買行為具象化,從新的維度提高用戶服務(wù)水平。 隨著移動(dòng)互聯(lián)網(wǎng)、大數(shù)據(jù)、AI等技術(shù)日益成熟,實(shí)體行業(yè)領(lǐng)域的轉(zhuǎn)型成為業(yè)績(jī)提升的關(guān)鍵。對(duì)于零售行業(yè)從業(yè)者,這意味著思維方式的自我進(jìn)化,對(duì)于消費(fèi)者,則意味著與產(chǎn)品產(chǎn)生新的連接,享受更加個(gè)性化、更具人情味...
摘要:零售商家通過微信支付小程序?qū)崿F(xiàn)線上線下消費(fèi)一體化,通過線上支付線下單品完成商品數(shù)據(jù)的打通。因此小程序搭載智慧零售,能助力商家實(shí)現(xiàn)消費(fèi)場(chǎng)景數(shù)字化以及購買行為具象化,從新的維度提高用戶服務(wù)水平。 隨著移動(dòng)互聯(lián)網(wǎng)、大數(shù)據(jù)、AI等技術(shù)日益成熟,實(shí)體行業(yè)領(lǐng)域的轉(zhuǎn)型成為業(yè)績(jī)提升的關(guān)鍵。對(duì)于零售行業(yè)從業(yè)者,這意味著思維方式的自我進(jìn)化,對(duì)于消費(fèi)者,則意味著與產(chǎn)品產(chǎn)生新的連接,享受更加個(gè)性化、更具人情味...
摘要:目前支持哪些平臺(tái)的搬家目前對(duì)外開放版本釋放了微信小程序轉(zhuǎn)支付寶小程序的功能,這也是我們?cè)谡{(diào)研中發(fā)現(xiàn)需求最多的。從筆者的了解來看,微信小程序框架原理更接近于,而支付寶小程序更接近于。 原文地址: https://ant-move.github.io/we... 螞蟻搬家工具(Antmove)是一個(gè)小程序開發(fā)輔助工具,致力于解決小程序跨平臺(tái)開發(fā)的難題,借助于 Antmove,你只需要編寫...
閱讀 3532·2023-04-25 20:09
閱讀 3736·2022-06-28 19:00
閱讀 3056·2022-06-28 19:00
閱讀 3075·2022-06-28 19:00
閱讀 3168·2022-06-28 19:00
閱讀 2874·2022-06-28 19:00
閱讀 3038·2022-06-28 19:00
閱讀 2632·2022-06-28 19:00