php支付回调怎么写_php 微信支付回调校验的两种做法
支付的时候设置了异步回调地址
微信回调返回的数据是xml
1
直接用post或者get是获取不到微信返回的数据,需要使用 file_get_contents("php://input");
实现代码
/**
* @return string
*/
public function notify(): string
{
$xmlstr = file_get_contents("php://input");
if(empty($xmlstr)) return '非法访问';
$xmlObj = simplexml_load_string($xmlstr, 'SimpleXMLElement', LIBXML_NOCDATA);
$data = json_decode(json_encode($xmlObj),true);
if ($this->checkSign($data)) {
//校验通过,可以再增加对微信官方订单查询,判断订单真实性
return 'success';
}
return 'fail';
}
/**校验签名
* @param array $arr
* @return bool
*/
private function checkSign(array $arr): bool
{
$sign = $arr['sign'];
unset($arr['sign']);
$key='1234';//微信商户平台支付设置的key
ksort($arr);//根据key升序排序
$str=http_build_query($arr);//数组字典排序拼接字符串
$stringSignTemp = $str.'&key='.$key;//拼接上key
$signValue = md5($stringSignTemp);//md5处理
$signValue = strtoupper($signValue);//转大写
return $signValue == $sign;
}
也可以这样,直接使用官方SDK
require_once "../lib/WxPay.Api.php";
require_once '../lib/WxPay.Notify.php';
require_once "WxPay.Config.php";
require_once 'log.php';
//初始化日志
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);
class PayNotifyCallBack extends WxPayNotify
{
//查询订单
public function Queryorder($transaction_id)
{
$input = new WxPayOrderQuery();
$input->SetTransaction_id($transaction_id);
$config = new WxPayConfig();
$result = WxPayApi::orderQuery($config, $input);
Log::DEBUG("query:" . json_encode($result));
if(array_key_exists("return_code", $result)
&& array_key_exists("result_code", $result)
&& $result["return_code"] == "SUCCESS"
&& $result["result_code"] == "SUCCESS")
{
return true;
}
return false;
}
/**
*
* 回包前的回调方法
* 业务可以继承该方法,打印日志方便定位
* @param string $xmlData 返回的xml参数
*
**/
public function LogAfterProcess($xmlData)
{
Log::DEBUG("call back, return xml:" . $xmlData);
return;
}
//重写回调处理函数
/**
* @param WxPayNotifyResults $data 回调解释出的参数
* @param WxPayConfigInterface $config
* @param string $msg 如果回调处理失败,可以将错误信息输出到该方法
* @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
*/
public function NotifyProcess($objData, $config, &$msg)
{
var_dump($objData);
$data = $objData->GetValues();
//TODO 1、进行参数校验
if(!array_key_exists("return_code", $data)
||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
//TODO失败,不是支付成功的通知
//如果有需要可以做失败时候的一些清理处理,并且做一些监控
$msg = "异常异常";
return false;
}
if(!array_key_exists("transaction_id", $data)){
$msg = "输入参数不正确";
return false;
}
//TODO 2、进行签名验证
try {
$checkResult = $objData->CheckSign($config);
if($checkResult == false){
//签名错误
Log::ERROR("签名错误...");
return false;
}
} catch(Exception $e) {
Log::ERROR(json_encode($e));
}
//TODO 3、处理业务逻辑
Log::DEBUG("call back:" . json_encode($data));
$notfiyOutput = array();
//查询订单,判断订单真实性
if(!$this->Queryorder($data["transaction_id"])){
$msg = "订单查询失败";
return false;
}
return true;
}
}
$config = new WxPayConfig();
Log::DEBUG("begin notify");
$notify = new PayNotifyCallBack();
$notify->Handle($config, false);
php支付回调怎么写_php 微信支付回调校验的两种做法相关推荐
- php微信支付怎么来测试_PHP微信支付通知处理方式实现方法
本文是对上篇文章的一个补充,主要是官方没有关于通知的demo,摸石头过河真的很难受,方便大家开发,放出来给大家看看 通知机制的实现,官方只有文档没有demo代码,对没搞过的人来说,需要花大量时间来做测 ...
- php支付回调怎么写_php如何接入微信支付回调接口?PHP如何验证微信支付签名?PHP处理微信支付回调的函数...
需求: 安卓,ios端集成微信支付,PHPer(我)要提供一个接口给微信调用,(支付完成后调用),若是成功,就返回success,若是失败就返回fail,php 环境说明:thinkphp 框架开发 ...
- 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态
微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...
- 企业微信通讯录回调密文解析及微信支付回调密文解析异常处理
企业微信通讯录回调密文解析及微信支付回调密文解析异常处理 产生异常表现: javax.crypto.IllegalBlockSizeException: Input length must be mu ...
- php写的微信支付_安卓支付类文件
<?php class wechat_Android_pay {/*配置参数*/private $config = array('appid' => "wx11111111111 ...
- 微信支付 postman_小刘同学微信支付接入全笔记
走上"码农"这条路已经快一年半啦,做过不少的Demo和项目,也接触了不少的业务场景,8000w的大数据量处理,QPS500+的并发优化,也算是在开发的这条路上踏出了入门向前的步伐: ...
- 在线支付系列【15】微信支付实战篇之集成查询订单、支付通知API
有道无术,术尚可求,有术无道,止于术. 文章目录 前言 主动调用 商户订单号查询 回调通知 1. 添加通知回调地址 2. 通知处理 3. 通知接口 4. 测试 前言 在上篇文档中,我们简单实现了Nat ...
- 在线支付系列【14】微信支付实战篇之Native支付下单
有道无术,术尚可求,有术无道,止于术. 文章目录 Native支付 产品介绍 业务流程图 1. 下单 2. 支付 3. 并行处理 Native下单API 案例演示 1. 环境搭建 2. 创建商户订单 ...
- WordPress按钮秒支付插件发布,支持微信支付,支付宝,银联,京东,苏宁,易宝支付...
痛点: 我们用WordPress建设网站和开发移动应用,有时候我们其实不需要太多的流程,只是需要一个收款通道,但是可能对支持的渠道更加关注,特别是手机应用.所以WordPress按钮秒支付插件诞生了, ...
最新文章
- java网络编程(一)
- left join 、right join 、inner join和 full join的区别
- SQL语句大全(2)
- Mongo数据库搭建
- 【渝粤教育】电大中专建筑材料 (4)作业 题库
- 網頁設計收藏站70個
- 先码后看 Spring源码解析 侵立删
- 如何高效做问卷调查?
- java jar apktool,apktool.jar
- Docker镜像安装宋体
- JavaEE简易聊天室(Netbeans:Servlet+Cookie+Session)
- 以太网未识别的网络win10_win10以太网为什么无Internet未识别网络?
- Unity lua os.time超过2038年1月19日3时14分07秒会出问题的解决办法(新千年虫问题、C#时间)
- iOS设计模式四部曲(二) 结构型模式 内附Demo
- js中将从ajax获得的时间戳数字串转换成理解的时间格式
- GlobalSign的旗下的SSL证书产品
- Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 15
- 【java 高并发编程之JUC】2w字带你JUC从入门到精通
- 【PPT制作工具】超实用!有哪些鲜为人知却好用到爆的PPT辅助工具?
- JZOJ 4210. 【五校联考1day1】我才不是萝莉控呢
热门文章
- java中的static类_再议Java中的static关键字
- LInux下centos6.7 设置字符集,解决乱码问题
- 细数人们对安卓的误解
- [HDU 4842]--过河(dp+状态压缩)
- WP7游戏开发:TweeJump(cocos2d-xna)
- Mediator模式(C++中介者模式含个人Demo源码)
- Java 用接口实现加减乘除计算器
- centos7使用中文输入法
- 令新手头痛的java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet错误...
- Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP