<?php
namespace Api\Controller;
use Think\Controller;
/**
* 用别的框架改改也可以用
* 微信APP 支付 + 回调 适用于TP3.2
* 控制器名::WeChatPayController.class.php
*/
class WeChatPayController extends Controller {
private $appid = '###';//appID
private $mch_id = '##';//商户ID
private $key = '###';//key
private $notify ='####';//回调地址
private $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';//统一下请求地址
/**
* 微信统一下单接口
* 请求类型 :POST
* 所需参数 order 订单号 body 商品描述 total 金额
* @return json
*
*
*/
public function index() {
//订单号
$order = I('post.order', time() . mt_rand('1000', '9999'));
//内容
$body = I('post.body', '测试');
//金额默认为0.01
$total = ltrim(I('post.total', '0.01'),'-') * 100;
$array = ['appid' => $this -> appid,
'mch_id' => $this -> mch_id,
'nonce_str' => $this -> randomCreateStr(),
'body' => $body, 'out_trade_no' => $order,
'total_fee' => $total,
'spbill_create_ip' => $this->getIp(),
'notify_url' => $this->notify,
'trade_type' => 'APP'];
//生成签名
$sign = $this -> createSign($array);
$array['sign'] = $sign;
//生成xml
$xml = $this -> createXml($array);
//发送给微信服务器
$WeChatXml = $this -> postUrl($this -> url, $xml);
//转为数组
$WeChatArray = $this -> XMLDataParse($WeChatXml);
//进行判定
if ($WeChatArray['return_code'] != 'SUCCESS' || $WeChatArray['result_code'] != 'SUCCESS') {
exit(json_encode(['error' => 1, 'message' => $WeChatArray], JSON_UNESCAPED_UNICODE));
}
//对微信返回的签名进行验证是否正确
if (!$this -> verifySign($WeChatArray)) {
exit(json_encode(['error' => 1, 'message' => '微信返回签名失败'], JSON_UNESCAPED_UNICODE));
}
//组合要给APP 发送的数据
$AppArray = [
'appid' => $this -> appid,
'partnerid' => $this -> mch_id,
'prepayid' =>$WeChatArray['prepay_id'],
'package' =>'Sign=WXPay',
'noncestr'=>$this->randomCreateStr(),
'timestamp'=>time()
];
//进行签名
$sign = $this -> createSign($AppArray);
$AppArray['sign'] = $sign;
//转换成JSON 返回给APP
exit(json_encode($AppArray));
}
/**
*微信回调地址接口
*
*
*
*/
public function notify() {
//接收微信xml格式信息
$xmlData = file_get_contents('php://input');
//转换为数组
$array = json_decode($xmlData,TRUE);
$array = $this-> XMLDataParse($xmlData);
//对微信返回的签名进行验证是否正确
if (!$this -> verifySign($array)) {
exit('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名不正确]]></return_msg></xml>');
}
/**
* !!!注意: 下面的就是连接数据库了,做进一步处理
*
*
*
*/
//下面是处理完逻辑,返回给微信服务器的
//exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
}
private function postUrl($url, $paramsArray) {
$curl = curl_init();
// 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
// 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// 跳过证书检查
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
//curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
// 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1);
// 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $paramsArray);
// Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
// 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0);
// 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl);
// 执行操作
if (curl_errno($curl)) {
echo 'Errno' . curl_error($curl);
//捕抓异常
}
curl_close($curl);
// 关闭CURL会话
return $tmpInfo;
// 返回数据,json格式
}
/**
* 获取IP 地址
*
*
*/
private function getIp() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
/**
* 验证签名
*
*
*/
private function verifySign($array) {
$sign = $array['sign'];
unset($array['sign']);
$s = $this -> createSign($array);
return $s == $sign ? TRUE : FALSE;
}
/**
* 生成签名
* @param $array array 参数 以关联数组 的形势
*
* @return str 签名
*/
private function createSign($array) {
ksort($array);
$stringA = '';
foreach ($array as $ke => $value) {
$stringA .= $ke . '=' . $value . '&';
}
//$stringA = http_build_query($array);
$stringSignTemp = $stringA . "key=" . $this -> key;
$sign = strtoupper(md5($stringSignTemp));
return $sign;
}
/**
* 生成XML 格式文件
* @param $array array 参数 以关联数组 的形势
*
* @return str xml字符串
*/
private function createXml($array) {
$xml = '<xml>';
foreach ($array as $key => $value) {
$xml .= '<' . $key . '>' . $value . '</' . $key . '>';
}
$xml .= '</xml>';
return $xml;
}
/**
* 随机生成32位字符串
* @return str 32位字符串
*/
private function randomCreateStr() {
return strtoupper(md5(microtime(TRUE) . mt_rand(0, 9999)));
}
/**
* xml格式数据解析函数
* @param $xml str 微信返回的xml格式字符串
*
* @return array 数组
*/
private function XMLDataParse($xml) {
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
} 0
0
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。
76
2026.03.11
本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。
38
2026.03.10
本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。
83
2026.03.09
本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。
97
2026.03.06
本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。
223
2026.03.05
本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。
458
2026.03.04
2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!
169
2026.03.04
本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。
246
2026.03.03
本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。
34
2026.03.03
热门下载
相关下载
精品课程
最新文章

