在 layavel 框架中微信测试目录怎么设置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 layavel 框架中微信测试目录怎么设置相关的知识,希望对你有一定的参考价值。
参考技术A 1.安装php_weixin_provider在项目下运行composerrequirethirdproviders/weixin,即可完成安装。安装成功后,在项目的vendor目录下应该能看到php_weixin_provider的库文件:image2.配置 登录的参数一共有7个参数可以配置,分别是:client_id:对应公众号创建的应用appidclient_secret:对应公众号创建的应用appidredirect:对应 授权成功后的回调地址proxy_url:对应 授权的代理服务地址(其作用可阅读这篇文章了解)device:区别是PC端 登录还是移动端 登录,默认值为pc,如果是移动端,可设置为空state_cookie_name:授权链接中会包含随机的state参数,这个参数在 回调的时候会原封不动的返回来,届时可通过验证state参数是否与授权链接中传入的参数相同,来判断请求是否有效,防止CSRF攻击。这个方案,会在授权时把state参数先存到cookie里面,所以这个参数用来指定这个state参数存入的cookie名称,默认值是wx_state_cookiestate_cookie_time:指定wx_state_cookie的有效时长,默认是5分钟这七个参数有2种设置方式。第一种是把这些参数以大写的形式配置到.env配置文件里面:image注:1、每个配置项都是大写,且以WEIXIN_开头;2、前三个配置项与前面介绍的参数名称不完全一致,KEY对应client_id,SECRET对应client_secret,REDIRECT_URI对应redirect;3、其它的与前面介绍的参数名称一致。第二种是把这些参数配置到config/services.php文件里面去:image这种方式的配置,每个配置项的名称与前面介绍的一致。要注意的内容:由于php_weixin_provider是基于laravel/socialite实现的,它要求必须配置client_id,client_secret和redirect,否则php_weixin_provider实例化过程就会出错;对于client_id和client_secret,我认为统一配置在一个地方是没有问题的,但是对于redirect,如果统一配置,不一定符合所有场景的需求,因为不是每一个用到 登录的地方,最后的回调地址都是同一个;所以建议把redirect先配置成一个有效或无效非空的回调地址;反正在后面使用php_weixin_provider的时候还可以在调用的时候更改这个参数的值。proxy_url如果有,也建议配置在公共的地方;state_cookie_name和state_cookie_time由于都有默认值,基本上无需重新配置;device可以在使用的时候再指定。所有配置参数都可以在使用的时候重新指定。3.注册php_weixin_provider在项目的config/app.php文件里面,找到providers配置节,把如下代码加到它的配置数组里面:image4.注册第三方登录事件的监听在项目的app/Providers/EventServiceProvider.php里面加入以下代码:imagelaravel框架整体上是一种IOC跟事件驱动的思想,熟悉js就会对事件驱动非常熟悉,熟悉设计模式,就会对IOC(控制反转,也称为DI:依赖注入)比较熟悉,这个是理解第3步和第4步配置作用的关键。5.编写 登录的接口举例如下:+ViewcodeSocialite::with('weixin')会返回php_weixin_provider的实例,也就是它:image拿到这个实例之后,就可以采用链式的方式调用它提供的所有public方法,比如设置配置参数,setDevice等等。6.编写 登录回调的接口举例如下:+Viewcode通过Socialite::with('weixin')拿到php_weixin_provider实例后,调用user方法,就会自动跟 调用相关接口,并把 的返回值封装成对象返回。如果在此过程中,有任何错误都会以异常的形式抛出,比如state参数校验失败,比如code失效等。返回的$user对象包含的有效属性有:image小结:这个方案是基于laravel/socialite实现,并发布到composer来使用的。laravel/socialite是laravel官方提供的第三方登录的模块,基于它可以很方便的集成大部分第三方平台的认证,目前它官方已经提供很多第三方的登录实现:。除了国外的facebook,google,github等,国内的 ,微博, 也都有提供。我在一开始也用的是它官方提供的默认的 登录provider来做的,但是后来我发现了以下几个问题:1.不支持 授权的代理;2.pc端跟移动端竟然还是分两个项目来做的:image3.它封装的user对象里竟然不包含unionid4.更改配置参数的方式,实在是让人觉得难以使用:image所以我就在它官方的 登录provider基础上,按照自己的想法,重新实现了一个来解决我发现的这些问题tp中微信小程序上传怎么写
参考技术A 第一步 先把文件夹的那两个图片 配置成一样的路径 除了域名要改 其他保持一致。第二步 把 Weixinpay 这个文件夹放在 \ThinkPHP\Library\Vendor 将Weixinpay文件夹放置到这个Vendor文件夹中
第三步 把 WxJsAPIController.class.php 这个php文件 \Home\Controller 这里面
第四步 把 WxJsAPI这个文件夹 放置在 \Home\View 这个里面
第五步 成功调用微信公众号支付功能
jsApiCall.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'/>
<title>微信安全支付</title>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res)
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok")
//alert(res.err_code+res.err_desc+res.err_msg);
/*这里写如果支付成功的话执行什么操作*/
else
//返回跳转到订单详情页面
alert(支付失败);
);
function callpay()
if (typeof WeixinJSBridge == "undefined")
if( document.addEventListener )
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
else if (document.attachEvent)
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
else
jsApiCall();
</script>
</head>
<body>
<button style="width:210px; height:30px; background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="jsApiCall()" id="asd" >购买</button>
</p>
</body>
</html>
WxJsAPIController.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php
namespace Home\Controller;
use Think\Controller;
class WxJsAPIController extends Controller
public function _initialize()
//引入WxPayPubHelper
vendor('Weixinpay.WxPayPubHelper');
public function jsApiCall()
//使用jsapi接口
$jsApi = new \JsApi_pub();
//=========步骤1:网页授权获取用户openid============
//通过code获得openid
//
//
if (!isset($_GET['code']))
//触发微信返回code码
$rUrl=urlencode(C('WxConfig.JS_API_CALL_URL').'/id/'.$_GET[id]);
/*注意一下这个 id 是为了可以成功的传个 id值才这样写 如果你不需要的话也可以直接写成
$rUrl=urlencode(C('WxConfig.JS_API_CALL_URL'));
$this->redirect('WxJsAPI/jsApiCall',array('id' =>55),0, '页面跳转中...');
我是这样穿这个id过来的值得你们也可以自己改成其他的来传这个id 或是删除他不要
*/
$url = $jsApi->createOauthUrlForCode($rUrl);
// echo $url;exit();
Header("Location: $url");
else
//获取code码,以获取openid
$code = $_GET['code'];
$jsApi->setCode($code);
$openid = $jsApi->getOpenId();//openid 这里是为了获取用户当前的openid 如果你有做微信登陆的话就可以无视他。
//=========步骤2:使用统一支付接口,获取prepay_id============
//使用统一支付接口
$unifiedOrder = new \UnifiedOrder_pub();
/*此处做数据库的查询 这里操作数据库把产品信息显示出来*/
/*此处做数据库的查询 这里操作数据库把产品信息显示出来*/
//设置统一支付接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//spbill_create_ip已填,商户无需重复填写
//sign已填,商户无需重复填写
//
$NOTIFY_URL="你的域名/index.php/Home/WxJsAPI/notify";
$unifiedOrder->setParameter("openid",$openid);//openid
$unifiedOrder->setParameter("body",'商品的名字');//商品描述
$unifiedOrder->setParameter("out_trade_no",'123456789');//商户订单号
$unifiedOrder->setParameter("total_fee",1*100);//总金额 微信的钱1*100等于1
$unifiedOrder->setParameter("notify_url",$NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
//非必填参数,商户可根据实际情况选填
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
//$unifiedOrder->setParameter("device_info","XXXX");//设备号
//$unifiedOrder->setParameter("attach","XXXX");//附加数据
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
//$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
//$unifiedOrder->setParameter("openid","XXXX");//用户标识
//$unifiedOrder->setParameter("product_id","XXXX");//商品ID
$prepay_id = $unifiedOrder->getPrepayId();
// echo $prepay_id;exit();
//=========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
$WEB_HOST='你的域名';//填写的话 如 <a rel="nofollow" href="http://nicaicai.imwork.net" target="_blank">http://nicaicai.imwork.net</a> 最后面不用加 /
$this->assign('HOSTS',$WEB_HOST);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display();
//echo $jsApiParameters;
public function notify()
//使用通用通知接口
$notify = new \Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);
//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
if($notify->checkSign() == FALSE)
$notify->setReturnParameter("return_code","FAIL");//返回状态码
$notify->setReturnParameter("return_msg","签名失败了啊");//返回信息
else
$notify->setReturnParameter("return_code","SUCCESS");//设置返回码
$returnXml = $notify->returnXml();
echo $returnXml;
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
//以log文件形式记录回调信息
// $log_ = new Log_();
$log_name= ROOT."/Public/notify_url.log";//log文件路径
if($notify->checkSign() == TRUE)
if ($notify->data["return_code"] == "FAIL")
//此处应该更新一下订单状态,商户自行增删操作
log_result($log_name,"【通信出错】:\n".$xml."\n");
elseif($notify->data["result_code"] == "FAIL")
//此处应该更新一下订单状态,商户自行增删操作
log_result($log_name,"【业务出错】:\n".$xml."\n");
else
/*查看支付成功的返回值请去 <a rel="nofollow" href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank">https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1</a> */
$xmlss=$notify->data["out_trade_no"];//订单号
$total_fee=$notify->data['total_fee'];//订单总金额,单位为分,详见支付金额
/*更新订单状态这里写数据库的操作*/
/*更新订单状态这里写数据库的操作*/
//此处应该更新一下订单状态,商户自行增删操作
log_result($log_name,"【支付成功】:\n".$xml."\n");
//商户自行增加处理流程,
//例如:更新订单状态
//例如:数据库操作
//例如:推送支付完成信息
// 打印log
public function log_result($file,$word)
$fp = fopen($file,"a");
flock($fp, LOCK_EX) ;
fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."\n".$word."\n\n");
flock($fp, LOCK_UN);
fclose($fp);
?>
希望我的回答可以帮到您哦本回答被提问者采纳
以上是关于在 layavel 框架中微信测试目录怎么设置的主要内容,如果未能解决你的问题,请参考以下文章