微信支付后异步回调处理

问题咨询 · laughmaker · 于 6年前 发布 · 8050 次阅读
   $body = \Yii::$app->request->getRawBody();
   $content = \Yii::$app->response->content;
    $data = \Yii::$app->response->data;
    $post = \GuzzleHttp\json_encode($_POST);
    $get = json_encode($_GET);
    $server = \GuzzleHttp\json_encode($_SERVER);
    $xml = file_get_contents("php://input");

    $data = @file_get_contents('php://input');// 等同于微信提供的:$GLOBALS['HTTP_RAW_POST_DATA']
	

在微信支付成功后,微信会调用这个地址,请问该如何取到微信传过来的数据呢? 以上方法都试了取不到。

共收到 6 条回复
Fecmall#16年前 0 个赞

1.微信发送消息给你的网站,应该是使用的是post请求,你要确定你的controller关闭了csrf(Yii2框架),否则无法访问你的controller

2.做一个log输出,输出信息到文件里面,controller 的action方法的第一句就写文件,先确定微信支付给你发送请求,

2.1如果没有发送请求,那么除了1部分说的csrf,另外,可能你在发起支付的时候,传给微信的回调地址不正确

2.2 如果接受到了请求,但是没有更改订单支付状态,打印一下微信post过来的数据参数,然后查看一下是哪里导致的原因。

Fecmall#26年前 0 个赞

Yii2关闭csrf

class StandardController extends AppfrontController
{
    
    public $enableCsrfValidation = false;  // 将这个类变量设置成false即可关闭,关闭后可以接收没有_csrf参数的post请求。
Fecmall#36年前 0 个赞

至于怎么接收回调地址(IPN)参数,这个我不了解了,当时想做这个,但是没有公众号,最后作罢,只做了一个微信pc端扫码支付,也就是:https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/modules/Payment/controllers/wxpay/StandardController.php

扫码支付不需要ipn消息,是通过ajax间隔时间去查微信接口支付状态,

因此,帮不上了,您自己查阅一下吧,微信支付就是个奇葩:

1.没有沙盒环境

2.公众号支付只能在微信内,不能在浏览器中支付(鄙视)

3.在微信外部支付的是另外一种方式,这种方式居然不能在微信内用(鄙视)

太奇葩

laughmaker#46年前 0 个赞

搞定了,非常感谢。

$xml = @file_get_contents('php://input');

实际就是通过这个去接收数据。

    $xml = @file_get_contents('php://input');
    $data = XMLConverter::xml2array($xml);
    \Yii::error($data, 'error');

    Mailer::send('674081011@qq.com', '订单回调,测试一下', \GuzzleHttp\json_encode($data));

我之前为了方便,直接在通知里,把数据通过邮件发给我,但我发觉,我直接发送$xml,收到的数据只有1,但如果我转成array后,整个数据就是完整的。可能是因为微信的这个接口是通过流的方式传输的吧,具体我还没太搞明白。

Fecmall#56年前 0 个赞

@laughmaker [#4楼](#comment4)

http://www.fecshop.com/topic/413

您可以了解一下我之前整理的分析Yii2的一篇文章,您可以使用Yii2设置获取,可以很方便的从 Yii::$app->request->post()中获取,上面这篇文章是代码原理分析

Fecmall#66年前 0 个赞

您的那种方法肯定是可以的,Yii2对json这种,就是您的代码获取的。

上面那篇文章里面有

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics