php微信支付之APP支付方法
发布:smiling 来源: PHP粉丝网 添加日期:2021-05-15 15:39:35 浏览: 评论:0
这篇文章主要介绍了php微信支付之APP支付方法,实例分析了php微信支付接口文件及使用技巧,需要的朋友可以参考下
本文实例讲述了微信开放平台移动应用集成微信支付功能。分享给大家供大家参考。具体分析如下:
WechatAppPay文件代码如下:
- <?php
- namespace common\services\WechatPay;
- class WechatAppPay extends WechatPayBase
- {
- //package参数
- public $package = [];
- //异步通知参数
- public $notify = [];
- //推送预支付订单参数
- protected $config = [];
- //存储access token和获取时间的文件
- protected $file;
- //access token
- protected $accessToken;
- //取access token的url
- const ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
- //生成预支付订单提交地址
- const POST_ORDER_URL = 'https://api.weixin.qq.com/pay/genprepay?access_token=%s';
- public function __construct()
- {
- $this->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(!emptyempty($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) );
- }
- }
Tags: php微信支付 APP支付
- 上一篇:php支付宝手机网页支付类实例
- 下一篇:PHP多线程编程之管道通信实例分析
相关文章
- ·PHP开发微信支付的代码分享(2021-01-10)
- ·浅析PHP微信支付通知的处理方式(2021-01-10)
- ·PHP实现APP微信支付的实例讲解(2021-09-03)
- ·php实现微信支付之企业付款(2021-09-21)
- ·php实现微信支付之退款功能(2021-09-21)
- ·PHP实现 APP端微信支付功能(2021-10-05)
- ·PHP微信H5支付开发实例(2021-10-19)
- ·php对微信支付回调处理的方法(2021-10-26)
- ·PHP微信支付结果通知与回调策略分析(2021-11-03)
- ·PHP的微信支付接口使用方法讲解(2021-11-11)
- ·PHP 实现手机端APP支付宝支付功能(2021-09-25)
- ·php app支付宝回调(异步通知)详解(2021-10-19)
- ·PHP实现的微信APP支付功能示例【基于TP5框架】(2021-12-18)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)