百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

集成Laravel框架里的微信支付(laravel小程序支付)

toyiye 2024-09-14 13:43 4 浏览 0 评论

微信支付集成到框架里面具体如下:

1.首先,我们要去官方下载人家做好的DEMO,链接是https://pay.weixin.qq.com/wiki/doc/api/jsapi.PHP?chapter=11_1

2.下载好以后,我们可以把里面的东西放到app\Wechat里(文件夹需要新建)

3.打开lib/WxPay.Config.php,把里面四个重要参数改成自己的,下面有两个证书路径,如果有退款什么的才需要,光支付就不管他

  1. const APPID = '在你的公众号里看';

  2. const MCHID = '商户ID';

  3. const KEY = '自己在公众号设置的32位';

  4. const APPSECRET = '也在公众号里看';

4.在resource/view/下新建文件夹wechat,里面视图就把app\Wechat里面的jsapi.php改名为jsapi.blade.php放进去,这里要说一下,引用的文件路径,必须是我这种格式“../app/Wechat”下才能正确读取,而且把所有app/Wechat下的各种文件都打开,里面只要用到路径,你就在require_once后面加个“../app/Wechat/”

  1. <?php

  2. ini_set('date.timezone','Asia/Shanghai');

  3. //error_reporting(E_ERROR);

  4. require_once"../app/Wechat/lib/WxPay.Api.php";

  5. require_once"../app/Wechat/example/WxPay.JsApiPay.php";

  6. require_once'../app/Wechat/example/log.php';

  7. //①、获取用户openid

  8. $tools = new JsApiPay();

  9. $openId = $tools->GetOpenid("/wechat?money=".$money); //传参要这样传,还要改一下example/WxPay.JsApiPay.php文件

  10. //②、统一下单

  11. $input = new WxPayUnifiedOrder();

  12. $input->SetBody("微信支付");

  13. $input->SetAttach("微信支付");

  14. $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));

  15. $input->SetTotal_fee($money);

  16. $input->SetTime_start(date("YmdHis"));

  17. $input->SetTime_expire(date("YmdHis", time() + 600));

  18. $input->SetGoods_tag("");

  19. $input->SetNotify_url("http://aaa.com/wechat/notify");//这里填你的回调路径,是绝对路径,例如http://aaa.com/wechat/notify

  20. $input->SetTrade_type("JSAPI");

  21. $input->SetOpenid($openId);

  22. $order = WxPayApi::unifiedOrder($input);

  23. // echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';

  24. // printf_info($order);

  25. $jsApiParameters = $tools->GetJsApiParameters($order);

  26. //获取共享收货地址js函数参数

  27. $editAddress = $tools->GetEditAddressParameters();

  28. //③、在支持成功回调通知中处理成功之后的事宜,见 notify.php

  29. /**

  30. * 注意:

  31. * 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功

  32. * 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,

  33. * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)

  34. */

  35. ?>

  36. <html>

  37. <head>

  38. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>

  39. <meta name="viewport" content="width=device-width, initial-scale=1"/>

  40. <title>微信支付</title>

  41. <script src="http://7xwdxi.com1.z0.glb.clouddn.com/lib/js/jquery-2.0.3.min.js"></script>

  42. <script type="text/javascript">

  43. //调用微信JS api 支付

  44. function jsApiCall()

  45. {

  46. WeixinJSBridge.invoke(

  47. 'getBrandWCPayRequest',

  48. <?php echo$jsApiParameters; ?>,

  49. function(res){

  50. //这底下的东西就是上面$input->SetNotify_url("http://aaa.com/notify");这个传过来的

  51. WeixinJSBridge.log(res.err_msg);

  52. // alert(res.err_code+res.err_desc+res.err_msg);

  53. if (res.err_msg == "get_brand_wcpay_request:ok") { //如果微信支付成功

  54. // message: "微信支付成功!"

  55. alert("支付成功!");

  56. window.location.href="/wechat/do;//你成功后要跳转的页面或控制器

  57. }elseif(res.err_msg == "get_brand_wcpay_request:cancel"){ //如果取消微信支付

  58. alert("您已取消支付");

  59. }

  60. }

  61. );

  62. }

  63. function callpay()

  64. {

  65. if (typeof WeixinJSBridge == "undefined"){

  66. if( document.addEventListener ){

  67. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);

  68. }elseif (document.attachEvent){

  69. document.attachEvent('WeixinJSBridgeReady', jsApiCall);

  70. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);

  71. }

  72. }else{

  73. jsApiCall();

  74. }

  75. }

  76. </script>

  77. <script type="text/javascript">

  78. //获取共享地址

  79. function editAddress()

  80. {

  81. WeixinJSBridge.invoke(

  82. 'editAddress',

  83. <?php echo$editAddress; ?>,

  84. function(res){

  85. var value1 = res.proviceFirstStageName;

  86. var value2 = res.addressCitySecondStageName;

  87. var value3 = res.addressCountiesThirdStageName;

  88. var value4 = res.addressDetailInfo;

  89. var tel = res.telNumber;

  90. alert(value1 + value2 + value3 + value4 + ":" + tel);

  91. }

  92. );

  93. }

  94. window.onload = function(){

  95. if (typeof WeixinJSBridge == "undefined"){

  96. if( document.addEventListener ){

  97. document.addEventListener('WeixinJSBridgeReady', editAddress, false);

  98. }elseif (document.attachEvent){

  99. document.attachEvent('WeixinJSBridgeReady', editAddress);

  100. document.attachEvent('onWeixinJSBridgeReady', editAddress);

  101. }

  102. }else{

  103. editAddress();

  104. }

  105. };

  106. </script>

  107. </head>

  108. <body>

  109. <div class="title-bar">

  110. <span><a href="/home/student/pay"><img src="http://7xwdxi.com1.z0.glb.clouddn.com/images/back-icon.png"></a></span>

  111. <h1>充值</h1>

  112. </div>

  113. <br/>

  114. <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px"><?php $sum=$money/100; ?>{{$sum}}</span>元钱</b></font><br/><br/>

  115. <div align="center">

  116. <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>

  117. </div>

  118. </body>

  119. </html>

5.写控制器,新建控制器叫WechatController,主要是回调函数里写好你的逻辑(官方无回调文档,很坑)

  1. ...

  2. publicfunction index(Request $request){

  3. if(!is_numeric(Input::get('money'))){

  4. return Redirect::back();

  5. }

  6. $money = Input::get('money')*10;

  7. //因为微信的钱是按分为单位,所以传进来,先*10,然后微信会回调回来,在执行一次这个方法,所以再*10,如果是5元,传个5就变成500分,就是5元钱了

  8. return view("home.student.jsapi")

  9. ->withMoney($money);//把money作为参数带到jsapi.blade.php

  10. }

  11. publicfunction notify(){ //这里是你的回调函数,这个很坑,官方都没有文档的

  12. publicfunction notify(Request $request){

  13. $streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; //拿到微信回调回来的信息判断支付成功没

  14. if(empty($streamData)){

  15. $streamData = file_get_contents('php://input');

  16. }

  17. if($streamData!=''){

  18. $streamData=xmlToArray($streamData);

  19. $Data=json_encode($streamData);

  20. Log::debug('Alipay notify post data verification fail.', [ //写入服务器文档,你不加这个也行

  21. 'data' => $Data.'xxxxxx'

  22. ]);

  23. if($streamData['return_code'] == 'SUCCESS' && $streamData['result_code'] == 'SUCCESS'){ //支付成功

  24. try { //开始事务

  25. //支付成功,你要干些什么都写这里,例如增加余额的操作什么的

  26. } catch (Exception $e) {

  27. //如果try里面的东西出现问题的话,进行数据库回滚

  28. throw$e;

  29. }

  30. }

  31. }else{

  32. $ret = false; //支付失败

  33. }

  34. }

  35. }

6.注册路由(这里最好用any的方法,因为发过去是post,回来的是get)

  1. Route::any(‘wechat’,'WechatController@index');

  2. Route::any(‘wechat/notify’,'WechatController@notify');

7.app/Wechat/example/WxPay.JsApiPay.php里面的getopenid方法还要改一下,否则不能传参数

  1. ...

  2. publicfunction GetOpenid($addUrl="")

  3. {

  4. //通过code获得openid

  5. if (!isset($_GET['code'])){

  6. //触发微信返回code码

  7. $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$addUrl);

  8. $url = $this->__CreateOauthUrlForCode($baseUrl);

  9. Header("Location: $url");

  10. exit();

  11. } else {

  12. //获取code码,以获取openid

  13. $code = $_GET['code'];

  14. $openid = $this->getOpenidFromMp($code);

  15. return$openid;

  16. }

  17. }

...8.这样程序这块基本就完事了,访问时你要花的钱要这么传http://aaa.com/wechat?money=5(这样的话是充5元钱)

9.下面就要说说微信公众平台上,一共需要修改3个地方

(1)在开发者工具下面,修改网页账号(否则通过不了Oauth2.0验证会报redirect_url错误)

(2)验证你的URL,URL就是这个验证文件在项目中的位置,如果放到public文件夹下,你就直接写http://nba.com/wx_sample.php

验证文件如下:

wx_sample.php

  1. <?php

  2. /**

  3. * wechat php test

  4. */

  5. //define your token

  6. define("TOKEN", "weixin");//和你在公众号中填的TOKEN相同

  7. $wechatObj = new wechatCallbackapiTest();

  8. $wechatObj->valid();

  9. class wechatCallbackapiTest

  10. {

  11. publicfunction valid()

  12. {

  13. $echoStr = $_GET["echostr"];

  14. //valid signature , option

  15. if($this->checkSignature()){

  16. echo$echoStr;

  17. exit;

  18. }

  19. }

  20. publicfunction responseMsg()

  21. {

  22. //get post data, May be due to the different environments

  23. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

  24. //extract post data

  25. if (!empty($postStr)){

  26. /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,

  27. the best way is to check the validity of xml by yourself */

  28. libxml_disable_entity_loader(true);

  29. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

  30. $fromUsername = $postObj->FromUserName;

  31. $toUsername = $postObj->ToUserName;

  32. $keyword = trim($postObj->Content);

  33. $time = time();

  34. $textTpl = "<xml>

  35. <ToUserName><![CDATA[%s]]></ToUserName>

  36. <FromUserName><![CDATA[%s]]></FromUserName>

  37. <CreateTime>%s</CreateTime>

  38. <MsgType><![CDATA[%s]]></MsgType>

  39. <Content><![CDATA[%s]]></Content>

  40. <FuncFlag>0</FuncFlag>

  41. </xml>";

  42. if(!empty( $keyword ))

  43. {

  44. $msgType = "text";

  45. $contentStr = "Welcome to wechat world!";

  46. $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

  47. echo$resultStr;

  48. }else{

  49. echo"Input something...";

  50. }

  51. }else {

  52. echo"";

  53. exit;

  54. }

  55. }

  56. privatefunction checkSignature()

  57. {

  58. // you must define TOKEN by yourself

  59. if (!defined("TOKEN")) {

  60. thrownew Exception('TOKEN is not defined!');

  61. }

  62. $signature = $_GET["signature"];

  63. $timestamp = $_GET["timestamp"];

  64. $nonce = $_GET["nonce"];

  65. $token = TOKEN;

  66. $tmpArr = array($token, $timestamp, $nonce);

  67. // use SORT_STRING rule

  68. sort($tmpArr, SORT_STRING);

  69. $tmpStr = implode( $tmpArr );

  70. $tmpStr = sha1( $tmpStr );

  71. if( $tmpStr == $signature ){

  72. return true;

  73. }else{

  74. return false;

  75. }

  76. }

  77. }

(3)修改开发配置(支付授权目录和测试授权目录),这里要注意,如果你的支付路径是http://nba.com/index.php/wechat,你就填http://nba.com/index.php/,注意做后的“/”去掉。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码