109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | WeChatDeveloper
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | 版权所有 2014~2022 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | 官方网站: https://thinkadmin.top
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | 开源协议 ( https://mit-license.org )
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | github开源项目:https://github.com/zoujingli/WeChatDeveloper
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace WePayV3;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								use WeChat\Contracts\Tools;
							 | 
						|||
| 
								 | 
							
								use WeChat\Exceptions\InvalidArgumentException;
							 | 
						|||
| 
								 | 
							
								use WePayV3\Contracts\BasicWePay;
							 | 
						|||
| 
								 | 
							
								use WePayV3\Contracts\DecryptAes;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 订单支付接口
							 | 
						|||
| 
								 | 
							
								 * Class Order
							 | 
						|||
| 
								 | 
							
								 * @package WePayV3
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								class Order extends BasicWePay
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    const WXPAY_H5 = 'h5';
							 | 
						|||
| 
								 | 
							
								    const WXPAY_APP = 'app';
							 | 
						|||
| 
								 | 
							
								    const WXPAY_JSAPI = 'jsapi';
							 | 
						|||
| 
								 | 
							
								    const WXPAY_NATIVE = 'native';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 创建支付订单
							 | 
						|||
| 
								 | 
							
								     * @param string $type 支付类型
							 | 
						|||
| 
								 | 
							
								     * @param array $data 支付参数
							 | 
						|||
| 
								 | 
							
								     * @return array
							 | 
						|||
| 
								 | 
							
								     * @throws \WeChat\Exceptions\InvalidResponseException
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public function create($type, $data)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $types = [
							 | 
						|||
| 
								 | 
							
								            'h5'     => '/v3/pay/transactions/h5',
							 | 
						|||
| 
								 | 
							
								            'app'    => '/v3/pay/transactions/app',
							 | 
						|||
| 
								 | 
							
								            'jsapi'  => '/v3/pay/transactions/jsapi',
							 | 
						|||
| 
								 | 
							
								            'native' => '/v3/pay/transactions/native',
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        if (empty($types[$type])) {
							 | 
						|||
| 
								 | 
							
								            throw new InvalidArgumentException("Payment {$type} not defined.");
							 | 
						|||
| 
								 | 
							
								        } else {
							 | 
						|||
| 
								 | 
							
								            // 创建预支付码
							 | 
						|||
| 
								 | 
							
								            $result = $this->doRequest('POST', $types[$type], json_encode($data, JSON_UNESCAPED_UNICODE), true);
							 | 
						|||
| 
								 | 
							
								            if (empty($result['prepay_id'])) return $result;
							 | 
						|||
| 
								 | 
							
								            // 支付参数签名
							 | 
						|||
| 
								 | 
							
								            $time = (string)time();
							 | 
						|||
| 
								 | 
							
								            $appid = $this->config['appid'];
							 | 
						|||
| 
								 | 
							
								            $prepayId = $result['prepay_id'];
							 | 
						|||
| 
								 | 
							
								            $nonceStr = Tools::createNoncestr();
							 | 
						|||
| 
								 | 
							
								            if ($type === 'app') {
							 | 
						|||
| 
								 | 
							
								                $sign = $this->signBuild(join("\n", [$appid, $time, $nonceStr, $prepayId, '']));
							 | 
						|||
| 
								 | 
							
								                return ['partnerId' => $this->config['mch_id'], 'prepayId' => $prepayId, 'package' => 'Sign=WXPay', 'nonceStr' => $nonceStr, 'timeStamp' => $time, 'sign' => $sign];
							 | 
						|||
| 
								 | 
							
								            } elseif ($type === 'jsapi') {
							 | 
						|||
| 
								 | 
							
								                $sign = $this->signBuild(join("\n", [$appid, $time, $nonceStr, "prepay_id={$prepayId}", '']));
							 | 
						|||
| 
								 | 
							
								                return ['appId' => $appid, 'timeStamp' => $time, 'nonceStr' => $nonceStr, 'package' => "prepay_id={$prepayId}", 'signType' => 'RSA', 'paySign' => $sign];
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                return $result;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 支付订单查询
							 | 
						|||
| 
								 | 
							
								     * @param string $orderNo 订单单号
							 | 
						|||
| 
								 | 
							
								     * @return array
							 | 
						|||
| 
								 | 
							
								     * @throws \WeChat\Exceptions\InvalidResponseException
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public function query($orderNo)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $pathinfo = "/v3/pay/transactions/out-trade-no/{$orderNo}";
							 | 
						|||
| 
								 | 
							
								        return $this->doRequest('GET', "{$pathinfo}?mchid={$this->config['mch_id']}", '', true);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 支付通知
							 | 
						|||
| 
								 | 
							
								     * @return array
							 | 
						|||
| 
								 | 
							
								     * @throws \WeChat\Exceptions\InvalidDecryptException
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public function notify(array $parameters = [])
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        if (empty($parameters)) {
							 | 
						|||
| 
								 | 
							
								            $body = file_get_contents('php://input');
							 | 
						|||
| 
								 | 
							
								            $data = json_decode($body, true);
							 | 
						|||
| 
								 | 
							
								        } else {
							 | 
						|||
| 
								 | 
							
								            $data = $parameters;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (isset($data['resource'])) {
							 | 
						|||
| 
								 | 
							
								            $aes = new DecryptAes($this->config['mch_v3_key']);
							 | 
						|||
| 
								 | 
							
								            $data['result'] = $aes->decryptToString(
							 | 
						|||
| 
								 | 
							
								                $data['resource']['associated_data'],
							 | 
						|||
| 
								 | 
							
								                $data['resource']['nonce'],
							 | 
						|||
| 
								 | 
							
								                $data['resource']['ciphertext']
							 | 
						|||
| 
								 | 
							
								            );
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return $data;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |