微信app支付 php,PHP实现的微信APP支付功能示例【基于TP5框架】

时间: 2023-09-02 12:08:50 浏览: 51
以下是基于TP5框架的微信APP支付功能示例: 1. 首先,在TP5框架的config目录下新建wxpay.php文件,用于存放微信支付相关的配置信息。 ```php <?php return [ // 应用ID 'app_id' => '', // 商户号 'mch_id' => '', // API密钥 'api_key' => '', // 异步通知地址 'notify_url' => '', // 交易类型 'trade_type' => 'APP', // 签名类型 'sign_type' => 'MD5', ]; ``` 2. 在TP5框架的extend目录下新建WxPay文件夹,并在该文件夹下新建WxPayApi.php文件,用于封装微信支付相关的接口。 ```php <?php namespace WxPay; use think\facade\Log; /** * 微信支付API */ class WxPayApi { /** * 统一下单接口 * * @param array $data * @return array */ public static function unifiedOrder($data) { $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $data['appid'] = config('wxpay.app_id'); $data['mch_id'] = config('wxpay.mch_id'); $data['nonce_str'] = self::getNonceStr(); $data['sign_type'] = config('wxpay.sign_type'); $data['sign'] = self::makeSign($data); $xml = self::toXml($data); $response = self::postXmlCurl($xml, $url, true, 6); $result = self::fromXml($response); if ($result['return_code'] == 'FAIL') { Log::error('统一下单失败:' . $result['return_msg']); return ['errcode' => 1, 'errmsg' => $result['return_msg']]; } if ($result['result_code'] == 'FAIL') { Log::error('统一下单失败:' . $result['err_code_des']); return ['errcode' => 1, 'errmsg' => $result['err_code_des']]; } $data = [ 'appid' => config('wxpay.app_id'), 'partnerid' => config('wxpay.mch_id'), 'prepayid' => $result['prepay_id'], 'package' => 'Sign=WXPay', 'noncestr' => self::getNonceStr(), 'timestamp' => time(), ]; $data['sign_type'] = config('wxpay.sign_type'); $data['sign'] = self::makeSign($data); return $data; } /** * 生成签名 * * @param array $data * @return string */ public static function makeSign($data) { ksort($data); $string = self::toUrlParams($data); $string = $string . '&key=' . config('wxpay.api_key'); if (config('wxpay.sign_type') == 'MD5') { $string = md5($string); } elseif (config('wxpay.sign_type') == 'HMAC-SHA256') { $string = hash_hmac('sha256', $string, config('wxpay.api_key')); } return strtoupper($string); } /** * 将数组转换为XML格式 * * @param array $data * @return string */ public static function toXml($data) { $xml = '<xml>'; foreach ($data as $key => $val) { if (is_numeric($val)) { $xml .= '<' . $key . '>' . $val . '</' . $key . '>'; } else { $xml .= '<' . $key . '><![CDATA[' . $val . ']]></' . $key . '>'; } } $xml .= '</xml>'; return $xml; } /** * 将XML转换为数组 * * @param string $xml * @return array */ public static function fromXml($xml) { libxml_disable_entity_loader(true); $result = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $result; } /** * 生成随机字符串 * * @param int $length * @return string */ public static function getNonceStr($length = 32) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $nonceStr = ''; for ($i = 0; $i < $length; $i++) { $nonceStr .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $nonceStr; } /** * 将数组转换为URL参数 * * @param array $data * @return string */ public static function toUrlParams($data) { $buff = ''; foreach ($data as $k => $v) { if ($k != 'sign' && $v != '' && !is_array($v)) { $buff .= $k . '=' . $v . '&'; } } $buff = trim($buff, '&'); return $buff; } /** * 发送POST请求 * * @param string $xml * @param string $url * @param bool $useCert * @param int $timeout * @return bool|string */ public static function postXmlCurl($xml, $url, $useCert = false, $timeout = 30) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if ($useCert) { curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLCERT, '/path/to/your/cert.pem'); curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLKEY, '/path/to/your/key.pem'); } curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $result = curl_exec($ch); curl_close($ch); return $result; } } ``` 3. 在控制器中调用WxPayApi类的unifiedOrder方法,实现微信支付功能。 ```php <?php namespace app\index\controller; use think\Controller; use WxPay\WxPayApi; class Index extends Controller { public function index() { $data = [ 'body' => '测试商品', 'out_trade_no' => date('YmdHis') . mt_rand(10000, 99999), 'total_fee' => 1, 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], ]; $result = WxPayApi::unifiedOrder($data); if ($result['errcode']) { return $result['errmsg']; } return json($result); } } ``` 以上是基于TP5框架的微信APP支付功能示例,具体实现可以根据自己的需要进行调整。

相关推荐

最新推荐

recommend-type

java实现微信H5支付方法详解

本篇文章主要介绍了java实现微信H5支付方法详解,非常具有实用价值,需要的朋友可以参考下
recommend-type

详解APP微信支付(java后台_统一下单和回调)

主要介绍了APP微信支付(java后台_统一下单和回调),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

基于C#实现微信支付宝扫码支付功能

为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能。需要的朋友跟随小编一起看看吧
recommend-type

Python使用微信SDK实现的微信支付功能示例

主要介绍了Python使用微信SDK实现的微信支付功能,结合实例形式分析了Python调用微信SDK接口实现微信支付功能的具体步骤与相关操作技巧,需要的朋友可以参考下
recommend-type

关于已有app更换微信和支付宝收款商户方法.docx

在已经比较正常app微信和支付宝收款通道的情况下 需要修改成第三方公司的收款账户,可以按文档操作进行更改。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。