日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeigniter中创建LeanCloud云函数实现微信支付

發(fā)布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeigniter中创建LeanCloud云函数实现微信支付 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

經(jīng)過摸索,與官方提供的slim無異,同樣使用__invoke魔法函數(shù)即可,步驟如下:

1.config.php打開hook,即設(shè)置$config['enable_hooks'] = TRUE;

詳情文檔參見:http://codeigniter.org.cn/user_guide/general/hooks.html

2.在hook.php中實現(xiàn)

<?phprequire_once __DIR__ . '/../third_party/wxpay/WxPay.Api.php';use \LeanCloud\Engine\LeanEngine; use \LeanCloud\Engine\Cloud; use \LeanCloud\Client; use \LeanCloud\Storage\CookieStorage; /** Define cloud functions and hooks on LeanCloud*/// /1.1/functions/sayHello Cloud::define("pay", function($params, $user) {// var_dump($user);$openid = $user->get('authData')["lc_weapp"]["openid"];// 初始化值對象$input = new WxPayUnifiedOrder();// 文檔提及的參數(shù)規(guī)范:商家名稱-銷售商品類目$input->SetBody($params['body']);// 訂單號應(yīng)該是由小程序端傳給服務(wù)端的,在用戶下單時即生成,demo中取值是一個生成的時間戳$input->SetOut_trade_no($params['tradeNo']);// 費用應(yīng)該是由小程序端傳給服務(wù)端的,在用戶下單時告知服務(wù)端應(yīng)付金額,demo中取值是1,即1分錢$input->SetTotal_fee($params['totalFee']);$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");$input->SetTrade_type("JSAPI");// 由小程序端傳給服務(wù)端$input->SetOpenid($openid);// 向微信統(tǒng)一下單,并返回order,它是一個array數(shù)組$order = WxPayApi::unifiedOrder($input);// json化返回給小程序端header("Content-Type: application/json");return getJsApiParameters($order);// return "hello {$params['name']}"; });function getJsApiParameters($UnifiedOrderResult) {if(!array_key_exists("appid", $UnifiedOrderResult)|| !array_key_exists("prepay_id", $UnifiedOrderResult)|| $UnifiedOrderResult['prepay_id'] == ""){throw new WxPayException("參數(shù)錯誤");}$jsapi = new WxPayJsApiPay();$jsapi->SetAppid($UnifiedOrderResult["appid"]);$timeStamp = time();$jsapi->SetTimeStamp("$timeStamp");$jsapi->SetNonceStr(WxPayApi::getNonceStr());$jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);$jsapi->SetSignType("MD5");$jsapi->SetPaySign($jsapi->MakeSign());$parameters = json_encode($jsapi->GetValues());return $parameters; }class CIEngine extends LeanEngine {function __invoke() {$this->dispatch($_SERVER['REQUEST_METHOD'],$_SERVER['REQUEST_URI']);} }$hook['pre_system'] = function() {// 參數(shù)依次為 AppId, AppKey, MasterKeyClient::initialize("SgHcsYqoLaFTG0XDMD3Gtm0I-**", "xdv2nwj**glFoFXkQcxP" ,"v3P5xzDa0b5***0xX0biHpT");Client::useMasterKey(true);Client::setStorage(new CookieStorage());$engine = new CIEngine();// 以下是核心語句,直接像使用函數(shù)那樣在對象上調(diào)用$engine(); };

3.最后,在小程序端調(diào)用云函數(shù)

AV.Cloud.run('pay', paramsJson).then(function(response) {response = JSON.parse(response);// 調(diào)用成功,得到成功的應(yīng)答 dataconsole.log(response);// 發(fā)起支付wx.requestPayment({'timeStamp': response.timeStamp,'nonceStr': response.nonceStr,'package': response.package,'signType': 'MD5','paySign': response.paySign,'success':function(res){wx.showToast({title: '支付成功'});// update order,此處是不良示范,應(yīng)該通過上述SetNotify_url回調(diào)通知里在服務(wù)端更新訂單狀態(tài)var query = new AV.Query('Order');query.get(that.data.orderId).then(function (order) {order.set('status', 1);order.save();console.log('status: ' + 1);}, function (err) {});}}); }, function(err) {// 處理調(diào)用失敗console.log(err); });

這里有一個坑,就是服務(wù)端發(fā)來的數(shù)據(jù)是純文本,而不是json對象,哪怕是調(diào)了header函數(shù),header("Content-Type: application/json");還是一樣,所以要強(qiáng)轉(zhuǎn)一下。

response = JSON.parse(response);

而之前的做法,要先在小程序中調(diào)用wx.login,請拿appid/appsecret獲取openId,最后wx.request請求統(tǒng)一下單url。現(xiàn)在的做法要簡單多的,小程序端就不關(guān)心https://lendoo.leanapp.cn這個地址是何物了,直接跑AV.Cloud.run()就可以了。

4. 完善微信支付回調(diào)通知

由服務(wù)端發(fā)起回調(diào)更新訂單的狀態(tài)才是正確的打開方式,于是在WXPay.php文件增加notify方法,供微信側(cè)回調(diào)用

public function notify() {//獲取通知的數(shù)據(jù)$xml = $GLOBALS['HTTP_RAW_POST_DATA'];//如果返回成功則驗證簽名$result = WxPayResults::Init($xml);$notify = new PayNotifyCallBack();$notify->Handle(false);$returnValues = $notify->GetValues(); //交易成功if(!empty($returnValues['return_code']) && $returnValues['return_code'] == 'SUCCESS'){ //商戶邏輯處理,如訂單狀態(tài)更新為已支付 $out_trade_no = $result['out_trade_no'];// 通過訂單id,將它改為已支付狀態(tài)$order = Object::create('Order', $out_trade_no);$order->set('status', 1);$order->save();} echo $notify->ToXml();//返回給微信確認(rèn) }

其中PayNotifyCallBack類,在微信提供的php sdk包已經(jīng)提供,我只是改了文件名,原包名為notify.php

微信php sdk的下載地址是:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip

相應(yīng)地,在統(tǒng)一下單的配置參數(shù)中,換上真實的回調(diào)地址,即將上述$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");更正為$input->SetNotify_url("https://lendoo.leanapp.cn/WXPay/notify");

這樣一來,微信支付那頭就是隔段時間發(fā)通知過來,直到處理成功為止;如果終止不能成功,微信端才會放棄。 源碼下載:http://git.oschina.net/dotton/lendoo-wx,本文涉及代碼存于/pages/order/payment文件夾中;相應(yīng)后端代碼托管在:http://git.oschina.net/dotton/lendoo-web,代碼存于config/hooks.php目錄下

對微信小程序開發(fā)有興趣的朋友可以關(guān)注我的公眾號【huangxiujie85】,第一時間獲取博文推送。

轉(zhuǎn)載于:https://my.oschina.net/huangxiujie/blog/913641

總結(jié)

以上是生活随笔為你收集整理的Codeigniter中创建LeanCloud云函数实现微信支付的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。