在使用微擎作为开发框架进行微信相关的功能开发时,微信支付是经常用到的开发场景。在微信支付成功后会通过site.php的payResult方法获取支付返回信息。

以下是返回信息的内容:

Array(
[weid]=>1
[uniacid]=>1
[result]=>success
[type]=>wechat
[from]=>return
[tid]=>120190307100444169206
[uniontid]=>2019030710044600001464806621
[user]=>opMGP1hN3nQzmnwYkGNtAiSrWDCI
[fee]=>0.01
[tag]=>Array(
[acid]=>1
[uid]=>1
[transaction_id]=>4200000280201903076920367458
)
[is_usecard]=>0
[card_type]=>0
[card_fee]=>0.01
[card_id]=>0
)

文档里面给出了范例文档:


//该代码片断在/framework/builtin/recharge/site.php中
publicfunctionpayResult($params){
//一些业务代码
//根据参数params中的result来判断支付是否成功
if($params['result']=='success'&&$params['from']=='notify'){
//此处会处理一些支付成功的业务代码
}
//因为支付完成通知有两种方式 notify,return,notify为后台通知,return为前台通知,需要给用户展示提示信息
//return做为通知是不稳定的,用户很可能直接关闭页面,所以状态变更以notify为准
//如果消息是用户直接返回(非通知),则提示一个付款成功
//如果是JS版的支付此处的跳转则没有意义
if($params['from']=='return'){
if($params['result']=='success'){
message('支付成功!','../../app/'.url('mc/home'),'success');
}else{
message('支付失败!','../../app/'.url('mc/home'),'error');
}
}
}

但是对于其中$params[‘from’]信息通知的来源类型没有说的很详细,我们单就通知print_r($params),获取到的信息,实际看到的都是return。其实,在我看到到return之前系统已经进行过一次后台通知,也是通过payResult方法获取。

下面通过一个方法来验证,我们写了个方法来截取$params[‘from’]。

PHP
1
pdo_insert('aiunv_log',array('info'=>$params['from']));

当我们支付完成的,系统便在后端进行了notify通知。

java微信支付退款返回null 微信支付成功返回值_ci

java微信支付退款返回null 微信支付成功返回值_PHP_02

停留在上面的页面,我们去数据库中看记录到了notify的值:

java微信支付退款返回null 微信支付成功返回值_微信支付_03

当我们点击完成,返回到场景界面时,系统又会推送一个前端通知。这时记录到的便是return了。

java微信支付退款返回null 微信支付成功返回值_PHP_04

这也就是为什么我们如果完成返回看到的都是return的原因,notify为后台通知,return为前台通知,需要给用户展示提示信息,return做为通知是不稳定的,用户很可能直接关闭页面,所以状态变更以notify为准,如果消息是用户直接返回(非通知),则提示一个付款成功,这样的好处就是不用担心用户意外关闭界面。