php微信支付之如何实现APP支付
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,小编给大家分享一下php微信支付之如何实现APP支付,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体分析如下:Wecha
千家信息网最后更新 2025年01月17日php微信支付之如何实现APP支付
小编给大家分享一下php微信支付之如何实现APP支付,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
具体分析如下:
WechatAppPay文件代码如下:
file = __DIR__ . '/payAccessToken.txt'; } /** * 创建APP支付最终返回参数 * @throws \Exception * @return multitype:string NULL */ public function createAppPayData() { $this->generateConfig(); $prepayid = $this->getPrepayid(); try{ $array = [ 'appid' => $this->appid, 'appkey' => $this->paySignkey, 'noncestr' => $this->getRandomStr(), 'package' => 'Sign=WXPay', 'partnerid' => $this->partnerId, 'prepayid' => $prepayid, 'timestamp' => (string)time(), ]; $array['sign'] = $this->sha1Sign($array); unset($array['appkey']); } catch(\Exception $e) { throw new \Exception($e->getMessage()); } return $array; } /** * 验证支付成功后的通知参数 * * @throws \Exception * @return boolean */ public function verifyNotify() { try{ $staySignStr = $this->notify; unset($staySignStr['sign']); $sign = $this->signData($staySignStr); return $this->notify['sign'] === $sign; } catch(\Exception $e) { throw new \Exception($e->getMessage()); } } /** * 魔术方法,给添加支付参数进来 * * @param string $name 参数名 * @param string $value 参数值 */ public function __set($name, $value) { $this->$name = $value; } /** * 设置access token * @param string $token * @throws \Exception * @return boolean */ public function setAccessToken() { try{ if(!file_exists($this->file) || !is_file($this->file)) { $f = fopen($this->file, 'a'); fclose($f); } $content = file_get_contents($this->file); if(!empty($content)) { $info = json_decode($content, true); if( time() - $info['getTime'] < 7150 ) { $this->accessToken = $info['accessToken']; return true; } } //文件内容为空或access token已失效,重新获取 $this->outputAccessTokenToFile(); } catch(\Exception $e) { throw new \Exception($e->getMessage()); } return true; } /** * 写入access token 到文件 * @throws \Exception * @return boolean */ protected function outputAccessTokenToFile() { try{ $f = fopen($this->file, 'wb'); $token = [ 'accessToken' => $this->getAccessToken(), 'getTime' => time(), ]; flock($f, LOCK_EX); fwrite($f, json_encode($token)); flock($f, LOCK_UN); fclose($f); $this->accessToken = $token['accessToken']; } catch(\Exception $e) { throw new \Exception($e->getMessage()); } return true; } /** * 取access token * * @throws \Exception * @return string */ protected function getAccessToken() { $url = sprintf(self::ACCESS_TOKEN_URL, $this->appid, $this->appSecret); $result = json_decode( $this->getUrl($url), true ); if(isset($result['errcode'])) { throw new \Exception("get access token failed:{$result['errmsg']}"); } return $result['access_token']; } /** * 取预支付会话标识 * * @throws \Exception * @return string */ protected function getPrepayid() { $data = json_encode($this->config); $url = sprintf(self::POST_ORDER_URL, $this->accessToken); $result = json_decode( $this->postUrl($url, $data), true ); if( isset($result['errcode']) && $result['errcode'] != 0 ) { throw new \Exception($result['errmsg']); } if( !isset($result['prepayid']) ) { throw new \Exception('get prepayid failed, url request error.'); } return $result['prepayid']; } /** * 组装预支付参数 * * @throws \Exception */ protected function generateConfig() { try{ $this->config = [ 'appid' => $this->appid, 'traceid' => $this->traceid, 'noncestr' => $this->getRandomStr(), 'timestamp' => time(), 'package' => $this->generatePackage(), 'sign_method' => $this->sign_method, ]; $this->config['app_signature'] = $this->generateSign(); } catch(\Exception $e) { throw new \Exception($e->getMessage()); } } /** * 生成package字段 * * 生成规则: * 1、生成sign的值signValue * 2、对package参数再次拼接成查询字符串,值需要进行urlencode * 3、将sign=signValue拼接到2生成的字符串后面得到最终的package字符串 * * 第2步urlencode空格需要编码成%20而不是+ * * RFC 1738会把 空格编码成+ * RFC 3986会把空格编码成%20 * * @return string */ protected function generatePackage() { $this->package['sign'] = $this->signData($this->package); return http_build_query($this->package, '', '&', PHP_QUERY_RFC3986); } /** * 生成签名 * * @return string */ protected function generateSign() { $signArray = [ 'appid' => $this->appid, 'appkey' => $this->paySignkey, 'noncestr' => $this->config['noncestr'], 'package' => $this->config['package'], 'timestamp' => $this->config['timestamp'], 'traceid' => $this->traceid, ]; return $this->sha1Sign($signArray); } /** * 签名数据 * * 生成规则: * 1、字典排序,拼接成查询字符串格式,不需要urlencode * 2、上一步得到的字符串最后拼接上key=paternerKey * 3、MD5哈希字符串并转换成大写得到sign的值signValue * * @param array $data 待签名数据 * @return string 最终签名结果 */ protected function signData($data) { ksort($data); $str = $this->arrayToString($data); $str .= "&key={$this->partnerKey}"; return strtoupper( $this->signMd5($str) ); } /** * sha1签名 * 签名规则 * 1、字典排序 * 2、拼接查询字符串 * 3、sha1运算 * * @param array $arr * @return string */ protected function sha1Sign($arr) { ksort($arr); return sha1( $this->arrayToString($arr) ); }}
以上是"php微信支付之如何实现APP支付"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
支付
参数
字符
字符串
生成
内容
文件
空格
篇文章
编码
规则
查询
字典
数据
排序
成功
不怎么
代码
再次
大写
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
java 代理服务器实现
什么叫计算机网络技术呢
ftp服务器搭建与管理
数据库索引占用空间吗
瀑布模型的软件开发模式
osi网络安全机制
广东oa软件开发报价
优质软件开发的服务机构
主城服务器
数据库中事务的例子
如何查看数据库表数据
电力行业数据库加密技术原理
收藏夹是不是数据库对象
武汉软件开发后端工资
康博智能网络技术有限公司
安防网络安全论文
数据库管理工程师考试多少钱
加强学生网络安全管理
浙江交通管理软件开发
整个oralce数据库备份
一年级网络安全小知识
廊坊数据库安全
服务器软件管家
枫叶网络安全绘画
七日杀服务器玩家存档在哪
网络安全 杨云亮
网络技术服务业是做什么的
软件开发分为哪些专业
mysql创建复制数据库
鄂尔多斯招聘软件开发