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

搜索
博主信息
博文 64
粉絲 6
評(píng)論 2
訪問(wèn)量 100638
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
laravel--對(duì)接微信JsApi支付
王嬌
原創(chuàng)
3357人瀏覽過(guò)

學(xué)習(xí)總結(jié)

" class="reference-link">1.下載微信支付sdk,放在laravel項(xiàng)目中的vendor目錄中,并且整理目錄中的文件

1.1把example文件夾中的以WxPay.開(kāi)頭的文件復(fù)制到lib文件夾中

1.2把lib文件夾中的以每個(gè)文件中的require_once中的路徑去掉,改為當(dāng)前文件夾下調(diào)用

2.更改WxPay.Config.php中的配置信息

  1. <?php
  2. /**
  3. *
  4. * example目錄下為簡(jiǎn)單的支付樣例,僅能用于搭建快速體驗(yàn)微信支付使用
  5. * 樣例的作用僅限于指導(dǎo)如何使用sdk,在安全上面僅做了簡(jiǎn)單處理, 復(fù)制使用樣例代碼時(shí)請(qǐng)慎重
  6. * 請(qǐng)勿直接直接使用樣例對(duì)外提供服務(wù)
  7. *
  8. **/
  9. require_once "WxPay.Config.Interface.php";
  10. /**
  11. *
  12. * 該類需要業(yè)務(wù)自己繼承, 該類只是作為deamon使用
  13. * 實(shí)際部署時(shí),請(qǐng)務(wù)必保管自己的商戶密鑰,證書(shū)等
  14. *
  15. */
  16. class WxPayConfig extends WxPayConfigInterface
  17. {
  18. //=======【基本信息設(shè)置】=====================================
  19. /**
  20. * TODO: 修改這里配置為您自己申請(qǐng)的商戶信息
  21. * 微信公眾號(hào)信息配置
  22. *
  23. * APPID:綁定支付的APPID(必須配置,開(kāi)戶郵件中可查看)
  24. *
  25. * MCHID:商戶號(hào)(必須配置,開(kāi)戶郵件中可查看)
  26. *
  27. */
  28. public function GetAppId()
  29. {
  30. return 'AppId';
  31. }
  32. public function GetMerchantId()
  33. {
  34. return '微信支付商戶號(hào)';
  35. }
  36. //=======【支付相關(guān)配置:支付成功回調(diào)地址/簽名方式】===================================
  37. /**
  38. * TODO:支付回調(diào)url
  39. * 簽名和驗(yàn)證簽名方式, 支持md5和sha256方式
  40. **/
  41. public function GetNotifyUrl()
  42. {
  43. return "";
  44. }
  45. public function GetSignType()
  46. {
  47. return "HMAC-SHA256";
  48. }
  49. //=======【curl代理設(shè)置】===================================
  50. /**
  51. * TODO:這里設(shè)置代理機(jī)器,只有需要代理的時(shí)候才設(shè)置,不需要代理,請(qǐng)?jiān)O(shè)置為0.0.0.0和0
  52. * 本例程通過(guò)curl使用HTTP POST方法,此處可修改代理服務(wù)器,
  53. * 默認(rèn)CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此時(shí)不開(kāi)啟代理(如有需要才設(shè)置)
  54. * @var unknown_type
  55. */
  56. public function GetProxy(&$proxyHost, &$proxyPort)
  57. {
  58. $proxyHost = "0.0.0.0";
  59. $proxyPort = 0;
  60. }
  61. //=======【上報(bào)信息配置】===================================
  62. /**
  63. * TODO:接口調(diào)用上報(bào)等級(jí),默認(rèn)緊錯(cuò)誤上報(bào)(注意:上報(bào)超時(shí)間為【1s】,上報(bào)無(wú)論成敗【永不拋出異?!?,
  64. * 不會(huì)影響接口調(diào)用流程),開(kāi)啟上報(bào)之后,方便微信監(jiān)控請(qǐng)求調(diào)用的質(zhì)量,建議至少
  65. * 開(kāi)啟錯(cuò)誤上報(bào)。
  66. * 上報(bào)等級(jí),0.關(guān)閉上報(bào); 1.僅錯(cuò)誤出錯(cuò)上報(bào); 2.全量上報(bào)
  67. * @var int
  68. */
  69. public function GetReportLevenl()
  70. {
  71. return 1;
  72. }
  73. //=======【商戶密鑰信息-需要業(yè)務(wù)方繼承】===================================
  74. /*
  75. * KEY:商戶支付密鑰,參考開(kāi)戶郵件設(shè)置(必須配置,登錄商戶平臺(tái)自行設(shè)置), 請(qǐng)妥善保管, 避免密鑰泄露
  76. * 設(shè)置地址:https://pay.weixin.qq.com/index.php/account/api_cert
  77. *
  78. * APPSECRET:公眾帳號(hào)secert(僅JSAPI支付的時(shí)候需要配置, 登錄公眾平臺(tái),進(jìn)入開(kāi)發(fā)者中心可設(shè)置), 請(qǐng)妥善保管, 避免密鑰泄露
  79. * 獲取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
  80. * @var string
  81. */
  82. public function GetKey()
  83. {
  84. return '商戶支付密鑰';
  85. }
  86. public function GetAppSecret()
  87. {
  88. return 'AppSecert';
  89. }
  90. //=======【證書(shū)路徑設(shè)置-需要業(yè)務(wù)方繼承】=====================================
  91. /**
  92. * TODO:設(shè)置商戶證書(shū)路徑
  93. * 證書(shū)路徑,注意應(yīng)該填寫(xiě)絕對(duì)路徑(僅退款、撤銷訂單時(shí)需要,可登錄商戶平臺(tái)下載,
  94. * API證書(shū)下載地址:https://pay.weixin.qq.com/index.php/account/api_cert,下載之前需要安裝商戶操作證書(shū))
  95. * 注意:
  96. * 1.證書(shū)文件不能放在web服務(wù)器虛擬目錄,應(yīng)放在有訪問(wèn)權(quán)限控制的目錄中,防止被他人下載;
  97. * 2.建議將證書(shū)文件名改為復(fù)雜且不容易猜測(cè)的文件名;
  98. * 3.商戶服務(wù)器要做好病毒和木馬防護(hù)工作,不被非法侵入者竊取證書(shū)文件。
  99. * @var path
  100. */
  101. public function GetSSLCertPath(&$sslCertPath, &$sslKeyPath)
  102. {
  103. $sslCertPath = '../cert/apiclient_cert.pem';
  104. $sslKeyPath = '../cert/apiclient_key.pem';
  105. }
  106. }

2.1AppIdAppSecert是微信公眾號(hào)(服務(wù)號(hào))申請(qǐng)時(shí)的,申請(qǐng)的微信公眾號(hào)必須已經(jīng)通過(guò)微信認(rèn)證。

2.2微信支付商戶號(hào)商戶密鑰是在微信支付的官方申請(qǐng)的商戶號(hào),申請(qǐng)后會(huì)有一個(gè)商戶密鑰


2.3在微信支付中關(guān)聯(lián)公眾號(hào)

2.4在微信公眾號(hào)中設(shè)置接口權(quán)限,登錄公眾號(hào),開(kāi)發(fā)—接口權(quán)限—功能服務(wù)—網(wǎng)頁(yè)授權(quán)

2.5在接口域名處填寫(xiě)微信支付發(fā)起的域名

3.微信支付控制器源碼Pay.php

  • 注意:前期vendor中sdk文件夾下的目錄調(diào)整,就是方便引用的時(shí)候目錄的一致性,包含后調(diào)起支付時(shí)所用到的類前必須加 \ 代表當(dāng)前文件下的類。
  1. <?php
  2. namespace App\Http\Controllers\homes;
  3. use App\Http\Controllers\Controller;
  4. use Exception;
  5. //手動(dòng)驗(yàn)證用戶名和密碼
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Http\Request;
  8. //引入數(shù)據(jù)庫(kù)查詢構(gòu)造器,鏈?zhǔn)秸{(diào)用
  9. use Illuminate\Support\Facades\DB;
  10. //引入redis
  11. use Illuminate\Support\Facades\Redis;
  12. //用戶支付控制器
  13. class Pay extends Controller
  14. {
  15. public function wxPay()
  16. {
  17. $dir = __DIR__.'\../../../../vendor/wxPay_sdk_v3.0.10/lib/';
  18. require_once $dir."WxPay.Api.php";
  19. require_once $dir."WxPay.JsApiPay.php";
  20. require_once $dir."WxPay.Config.php";
  21. //①、獲取用戶openid
  22. try{
  23. //計(jì)算總金額
  24. //通過(guò)Auth的自定義guard(門衛(wèi))獲取當(dāng)前用戶登錄id
  25. $memberID = Auth::guard('member')->id();
  26. //然后讀取redis中該用戶的所有點(diǎn)菜數(shù)據(jù)
  27. $orderData =json_decode(Redis::get('order'.$memberID),true);
  28. $res = [];
  29. $res['priceTotal'] = 0;
  30. if(is_array($orderData))
  31. {
  32. foreach($orderData as $key => $ordData)
  33. {
  34. $num =(int)$ordData['num'];
  35. $prices =json_decode($ordData['dish']['price'],true);
  36. $orderData[$key]['price'] = $prices[$ordData['priceKey']];
  37. $units = json_decode($ordData['dish']['unit'],true);
  38. $orderData[$key]['unit'] = $units[$ordData['priceKey']];
  39. $res['priceTotal']+=(float)$prices[$ordData['priceKey']]*$num;
  40. }
  41. }
  42. //調(diào)起微信支付jsApi接口
  43. $tools = new \JsApiPay();
  44. $openId = $tools->GetOpenid();
  45. //②、統(tǒng)一下單
  46. $input = new \WxPayUnifiedOrder();
  47. $input->SetBody("test");
  48. $input->SetAttach("test");
  49. $input->SetOut_trade_no("sdkphp".date("YmdHis"));
  50. $input->SetTotal_fee((string)($res['priceTotal']*100));
  51. $input->SetTime_start(date("YmdHis"));
  52. $input->SetTime_expire(date("YmdHis", time() + 600));
  53. $input->SetGoods_tag("test");
  54. $input->SetNotify_url("支付成功回調(diào)地址");
  55. $input->SetTrade_type("JSAPI");
  56. $input->SetOpenid($openId);
  57. $config = new \WxPayConfig();
  58. $order = \WxPayApi::unifiedOrder($config, $input);
  59. echo '<font color="#f00"><b>統(tǒng)一下單支付單信息</b></font><br/>';
  60. // $this->printf_info($order);
  61. $res['jsApiParameters'] = $tools->GetJsApiParameters($order);
  62. //獲取共享收貨地址js函數(shù)參數(shù)
  63. $res['editAddress'] = $tools->GetEditAddressParameters();
  64. return view('/homes/pay/wxPay',$res);
  65. }
  66. catch(Exception $e)
  67. {
  68. echo $e;
  69. exit;
  70. // Log::ERROR(json_encode($e));
  71. }
  72. }
  73. //打印輸出數(shù)組信息
  74. public function printf_info($data)
  75. {
  76. foreach($data as $key=>$value){
  77. echo "<font color='#00ff55;'>$key</font> : ".htmlspecialchars($value, ENT_QUOTES)." <br/>";
  78. }
  79. }
  80. public function wxPayCallBack()
  81. {
  82. echo 'wxsuccsss';
  83. }
  84. }

4.視圖頁(yè)源碼wxPay.blade.php

  • 注意:控制器傳來(lái)的數(shù)據(jù)jsApiParameterseditAddress是json數(shù)據(jù),必須解析后使用,否則無(wú)法調(diào)起支付
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <link rel="stylesheet" href="/static/plugins/layui/css/layui.css">
  8. <script src="/static/plugins/layui/layui.js"></script>
  9. <title>微信支付</title>
  10. <script type="text/javascript">
  11. layui.use(['layer'],function(){
  12. $ = layui.jquery;
  13. });
  14. //調(diào)用微信JS api 支付
  15. function jsApiCall()
  16. {
  17. var jsApiPar =JSON.parse($('input[name="jsApiPar"]').val());
  18. WeixinJSBridge.invoke(
  19. 'getBrandWCPayRequest',
  20. jsApiPar,
  21. function(res){
  22. WeixinJSBridge.log(res.err_msg);
  23. alert(res.err_code+res.err_desc+res.err_msg);
  24. }
  25. );
  26. }
  27. function callpay()
  28. {
  29. if (typeof WeixinJSBridge == "undefined"){
  30. if( document.addEventListener ){
  31. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
  32. }else if (document.attachEvent){
  33. document.attachEvent('WeixinJSBridgeReady', jsApiCall);
  34. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
  35. }
  36. }else{
  37. jsApiCall();
  38. }
  39. }
  40. </script>
  41. <script type="text/javascript">
  42. //獲取共享地址
  43. function editAddress()
  44. {
  45. var editAdd =JSON.parse($('input[name="editAdd"]').val());
  46. WeixinJSBridge.invoke(
  47. 'editAddress',
  48. editAdd,
  49. function(res){
  50. $('div[name="test"]').text(JSON.parse(res));
  51. var value1 = res.proviceFirstStageName;
  52. var value2 = res.addressCitySecondStageName;
  53. var value3 = res.addressCountiesThirdStageName;
  54. var value4 = res.addressDetailInfo;
  55. var tel = res.telNumber;
  56. alert(value1 + value2 + value3 + value4 + ":" + tel);
  57. }
  58. );
  59. }
  60. window.onload = function(){
  61. if (typeof WeixinJSBridge == "undefined"){
  62. if( document.addEventListener ){
  63. document.addEventListener('WeixinJSBridgeReady', editAddress, false);
  64. }else if (document.attachEvent){
  65. document.attachEvent('WeixinJSBridgeReady', editAddress);
  66. document.attachEvent('onWeixinJSBridgeReady', editAddress);
  67. }
  68. }else{
  69. editAddress();
  70. }
  71. };
  72. </script>
  73. </head>
  74. <body>
  75. <br/>
  76. <font color="#9ACD32"><b>該筆訂單支付金額為<span style="color:#f00;font-size:50px">{{$priceTotal}}</span></b></font><br/><br/>
  77. <div align="center">
  78. <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
  79. <input type="hidden" name="jsApiPar" value="{{$jsApiParameters}}">
  80. <input type="hidden" name="editAdd" value="{{$editAddress}}">
  81. </div>
  82. </body>
  83. </html>
本博文版權(quán)歸博主所有,轉(zhuǎn)載請(qǐng)注明地址!如有侵權(quán)、違法,請(qǐng)聯(lián)系admin@php.cn舉報(bào)處理!
全部評(píng)論 文明上網(wǎng)理性發(fā)言,請(qǐng)遵守新聞評(píng)論服務(wù)協(xié)議
0條評(píng)論
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學(xué)習(xí)!
    全站2000+教程免費(fèi)學(xué)