<?php namespace app\api\controller; use app\api\controller\Base; use app\common\model\GoodsOrder; use app\common\service\OrderCallback; use think\Controller; use think\Db; use think\Model; use Alipay\EasySDK\Kernel\Factory; use Alipay\EasySDK\Kernel\Util\ResponseChecker; use Alipay\EasySDK\Kernel\Config; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/Factory.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/Config.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/EasySDKKernel.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/AlipayConstants.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/Util/ResponseChecker.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/Util/JsonUtil.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/Util/Signer.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Payment/App/Client.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Payment/App/Models/AlipayTradeAppPayResponse.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Payment/Page/Client.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Kernel/Util/PageUtil.php'; require_once env('root_path').'vendor/alipaysdk/easysdk/php/src/Payment/Page/Models/AlipayTradePagePayResponse.php'; class Alipay extends Base { protected static $appid = [ 'H5'=>'2021003155604810', 'APP'=>'2021003155604810' ]; protected static $merchantPrivateKey = [ 'H5'=>'MIIEpQIBAAKCAQEAkfh1oGMZSI8t3WbvpgQhAiK5dk1aSUafBl8AEj+hJQaI6phA+J1IZFMWNPm5dvCwM+u3M/vahxHUgAP0EtL9IsGpqt77r11tKOtV5uMUQH356i8r/RQzOA+y42mShBSq682rC3h2Cn18Y9TDZzPjayGGYx7JA/6e2fbht5Pb23HtegtV7DZZuIVduNgV3EUXiBQBzpj+dO+XEP4+/EYCaqOGWWIZc2IlBgu0uf0ozmOSKvmMtozakl1t8B2JCcOAerCxpSH2XLNi8DyIuCEEiYGfhZwLTadom0M2J6UBGWhgPIq1A83BiZW38PlaldajP+OjicDzVNJPNP+2oVCt5QIDAQABAoIBAQCPUe9UIdjiSEqVFwt36pfqO+PzBvH9/kwHemFciYMUEn1+MS2hrPQ2JOop64OxB5NJ90dyz/b5JYWKh9cuYGDQrmuDbNqbjVSvl5lJUG5DAC3QRK6hFyNPCQLwjGiiLJTBX7dwVL85f4oRjwaonubM+iazzbc6p9aaVe+7Sn7Uz11Y7v+hQ9Zro/YwlQd+palXq0MQK2tAlF3xAgYPe50ztf5lsatGWcs7urWnVNgZLwlF1buoCHzzzJZ7fAzJgkydJjiIZVIXPAcn/gC5AgFV6T3G61jFSnYOrNL5D2xuh8M9tOZ5sq0C+29WCYETbO5X5IXJaUdiO3SEXytqDmrBAoGBAOv55a6sJBuAzmypNbsHlNNwXxePjhvJpDtr4NNVASuhcx8SaBjO2h18KMqufq34uWWeTbJwQRgfe9+v1Vvb8myffPePZw/LQsLPB5zAGTylUzYv3lm3tuKhryUbFrp46wTebWXjxOjmMDIfXCG6rGOwp/uGBBDvy7SwM9kjzpTRAoGBAJ5bX4JmqQC9tOOzCAoHuy3JyGP39DsGrCWqBkIBU2/nBMBtWSecgKvHLaS+lcaajHklju96AMUsPvK759Fd1P/zTNDuOIuklGbnZkZ6ZIZMnugigZvUQLULDVerrOpxYmFNNKJGofcYMYsUlGfLPUYoDIyLNwv8sS8IwQ+FqBzVAoGBAJmFag1axt7xzNpat68nPobUy7jbV1vysptKEunKmslU7z2ezwScxsB5/1vlbFsovw1CkU/uwhq8mO2tSoTJso1CsZ2puSZIWfW9lTlArOqMsHdHa0Q5Ro1pHTZpyj6k3lm7j7bDGV9gKqjhSCJVfUQaMR9tUAXozEGQhRrWtdaRAoGAVChBON7wIAmxsXT658G2Ex5yldY3gIsKP7X9P2TO/+BpYQ573BZLN39R3YS/ul12HAf+z3wqHp9mEMAV8emJAkE96KdBe80KZSnC69+tvsXHiZyU/sitXsmx3I7LBYkefJF4UGlzOAsugTh9qi+Tr84m5SYzKfav/0wKtgIVFsUCgYEAhvi3hDZWo78b8gKd57b1VhRaZEzYeb1TqUMfBuEG1sjqm3Lsshkf+fkdgSaWwgzCmci2iGIt4oCzg08QZRYNK7INAuk3kwVyrg7BvsydzVeT0wi5Ga7tktxzw99Z2/SUbCteIpJ5J4BGnL1ZFnP+3/naQhX5XrbGiu/bU42Zxg0=', 'APP'=>'MIIEpQIBAAKCAQEAkfh1oGMZSI8t3WbvpgQhAiK5dk1aSUafBl8AEj+hJQaI6phA+J1IZFMWNPm5dvCwM+u3M/vahxHUgAP0EtL9IsGpqt77r11tKOtV5uMUQH356i8r/RQzOA+y42mShBSq682rC3h2Cn18Y9TDZzPjayGGYx7JA/6e2fbht5Pb23HtegtV7DZZuIVduNgV3EUXiBQBzpj+dO+XEP4+/EYCaqOGWWIZc2IlBgu0uf0ozmOSKvmMtozakl1t8B2JCcOAerCxpSH2XLNi8DyIuCEEiYGfhZwLTadom0M2J6UBGWhgPIq1A83BiZW38PlaldajP+OjicDzVNJPNP+2oVCt5QIDAQABAoIBAQCPUe9UIdjiSEqVFwt36pfqO+PzBvH9/kwHemFciYMUEn1+MS2hrPQ2JOop64OxB5NJ90dyz/b5JYWKh9cuYGDQrmuDbNqbjVSvl5lJUG5DAC3QRK6hFyNPCQLwjGiiLJTBX7dwVL85f4oRjwaonubM+iazzbc6p9aaVe+7Sn7Uz11Y7v+hQ9Zro/YwlQd+palXq0MQK2tAlF3xAgYPe50ztf5lsatGWcs7urWnVNgZLwlF1buoCHzzzJZ7fAzJgkydJjiIZVIXPAcn/gC5AgFV6T3G61jFSnYOrNL5D2xuh8M9tOZ5sq0C+29WCYETbO5X5IXJaUdiO3SEXytqDmrBAoGBAOv55a6sJBuAzmypNbsHlNNwXxePjhvJpDtr4NNVASuhcx8SaBjO2h18KMqufq34uWWeTbJwQRgfe9+v1Vvb8myffPePZw/LQsLPB5zAGTylUzYv3lm3tuKhryUbFrp46wTebWXjxOjmMDIfXCG6rGOwp/uGBBDvy7SwM9kjzpTRAoGBAJ5bX4JmqQC9tOOzCAoHuy3JyGP39DsGrCWqBkIBU2/nBMBtWSecgKvHLaS+lcaajHklju96AMUsPvK759Fd1P/zTNDuOIuklGbnZkZ6ZIZMnugigZvUQLULDVerrOpxYmFNNKJGofcYMYsUlGfLPUYoDIyLNwv8sS8IwQ+FqBzVAoGBAJmFag1axt7xzNpat68nPobUy7jbV1vysptKEunKmslU7z2ezwScxsB5/1vlbFsovw1CkU/uwhq8mO2tSoTJso1CsZ2puSZIWfW9lTlArOqMsHdHa0Q5Ro1pHTZpyj6k3lm7j7bDGV9gKqjhSCJVfUQaMR9tUAXozEGQhRrWtdaRAoGAVChBON7wIAmxsXT658G2Ex5yldY3gIsKP7X9P2TO/+BpYQ573BZLN39R3YS/ul12HAf+z3wqHp9mEMAV8emJAkE96KdBe80KZSnC69+tvsXHiZyU/sitXsmx3I7LBYkefJF4UGlzOAsugTh9qi+Tr84m5SYzKfav/0wKtgIVFsUCgYEAhvi3hDZWo78b8gKd57b1VhRaZEzYeb1TqUMfBuEG1sjqm3Lsshkf+fkdgSaWwgzCmci2iGIt4oCzg08QZRYNK7INAuk3kwVyrg7BvsydzVeT0wi5Ga7tktxzw99Z2/SUbCteIpJ5J4BGnL1ZFnP+3/naQhX5XrbGiu/bU42Zxg0=', ]; protected static $alipayPublicKey = [ 'H5'=>'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAidau5/jnsnry1+3VDvTOO7S+Zsi1u+a0uNvacXXHAh78TQIWPBEt7U/XP7yh89+UDOZQPknxJjpfo53ciOAowEeGFH9O8NimtvSFMMF9iCQijmlhXyOCfZstLyrVRojcZTgv4//AjV877DrUBTsonpeGGSi92Ssl8COPWbr461UtYBCWjAK+UiZsh01ZI5LNTvt8bVyOWPhWDEcPvxxrkTqUF6qRO9Bvr169V0tZxiJgDLu891Ofim/TlD+tHgnOI9NfWQafRddylPCTzIHbaxZyQ0JmNJleROSCMNOpVZiWZX8+mQmhEpeodJ3MqYmAqN4Dla7fN54Y2wWHaRNkGwIDAQAB', 'APP'=>'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAidau5/jnsnry1+3VDvTOO7S+Zsi1u+a0uNvacXXHAh78TQIWPBEt7U/XP7yh89+UDOZQPknxJjpfo53ciOAowEeGFH9O8NimtvSFMMF9iCQijmlhXyOCfZstLyrVRojcZTgv4//AjV877DrUBTsonpeGGSi92Ssl8COPWbr461UtYBCWjAK+UiZsh01ZI5LNTvt8bVyOWPhWDEcPvxxrkTqUF6qRO9Bvr169V0tZxiJgDLu891Ofim/TlD+tHgnOI9NfWQafRddylPCTzIHbaxZyQ0JmNJleROSCMNOpVZiWZX8+mQmhEpeodJ3MqYmAqN4Dla7fN54Y2wWHaRNkGwIDAQAB', ]; /** * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException * 支付宝支付 */ public static function ali_pay($subject,$outTradeNo,$totalAmount,$notifyUrl){ Factory::setOptions(self::getOptions($notifyUrl,"APP")); try { //2. 发起API调用(以支付能力下的统一收单交易创建接口为例) //$result = Factory::payment()->common()->create("iPhone6 16G", "20200326235526001", "88.88", "2088002656718920"); $result = Factory::payment()->App()->pay($subject,$outTradeNo , $totalAmount); $responseChecker = new ResponseChecker(); //3. 处理响应或异常 if ($responseChecker->success($result)) { return $result->body; } else { echo "调用失败,原因:". $result->msg.",".$result->subMsg.PHP_EOL; } } catch (Exception $e) { return false; } } public static function ali_pay_pc($subject,$outTradeNo,$totalAmount,$notifyUrl,$returnUrl){ Factory::setOptions(self::getOptions($notifyUrl,'H5')); try { $result = Factory::payment()->Page()->pay($subject,$outTradeNo,$totalAmount,$returnUrl); $responseChecker = new ResponseChecker(); //3. 处理响应或异常 if ($responseChecker->success($result)) { return $result->body; } else { echo "调用失败,原因:". $result->msg.",".$result->subMsg.PHP_EOL; } } catch (Exception $e) { return false; } } public static function getOptions($notifyUrl,$type = 'H5'){ $options = new Config(); $options->protocol = 'https'; $options->gatewayHost = 'openapi.alipay.com'; $options->signType = 'RSA2'; $options->appId = static::$appid[$type]; // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 $options->merchantPrivateKey = static::$merchantPrivateKey[$type]; /*$options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径,例如:/foo/alipayCertPublicKey_RSA2.crt -->'; $options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径,例如:/foo/alipayRootCert.crt" -->'; $options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径,例如:/foo/appCertPublicKey_2019051064521003.crt -->';*/ //注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可 $options->alipayPublicKey = static::$merchantPrivateKey[$type]; //可设置异步通知接收服务地址(可选) $options->notifyUrl = $notifyUrl; //可设置AES密钥,调用AES加解密相关接口时需要(可选) $options->encryptKey = ""; return $options; } // 会员开通回调 public function LevelOrderNotify() { $result = input('post.'); $this->payResultLog($result,'dd_level_order'); if ($result['trade_status'] == 'TRADE_SUCCESS' || $result['trade_status'] == 'TRADE_FINISHED') { $pay_no = $result['out_trade_no']; $order_info = \app\common\model\LevelOrder::where('pay_no',$pay_no)->find(); if(!$order_info) return false; $order_info = $order_info->toArray(); if($order_info['status'] != 0) return true; $back_res = OrderCallback::levelOrderCallBack($order_info,1);// 支付完成后回调 return $back_res['ret_val']; } } // 活动报名回调 public function applyOrderNotify() { $result = input('post.'); $this->payResultLog($result,'dd_activity_apply'); if ($result['trade_status'] == 'TRADE_SUCCESS' || $result['trade_status'] == 'TRADE_FINISHED') { $pay_no = $result['out_trade_no']; $order_info = \app\common\model\ActivityApply::where('pay_no',$pay_no)->find(); if(!$order_info) return false; $order_info = $order_info->toArray(); if($order_info['status'] != 0) return true; $back_res = OrderCallback::activityOrderCallBack($order_info);// 支付完成后回调 return $back_res['ret_val']; } } // 商品支付回调 public function goodsOrderNotify() { $result = input('post.'); $this->payResultLog($result,'dd_goods_order'); if ($result['trade_status'] == 'TRADE_SUCCESS' || $result['trade_status'] == 'TRADE_FINISHED') { $pay_no = $result['out_trade_no']; $order_info = GoodsOrder::with('orderItem')->where('pay_no',$pay_no)->find(); if(!$order_info) return false; $order_info = $order_info->toArray(); if($order_info['status'] != 0) return true; $back_res = OrderCallback::goodsOrderCallBack($order_info,1);// 支付完成后回调 return $back_res['ret_val']; } } /** * 记录支付日志 * @param $message * @param $table_name */ public function payResultLog($message,$table_name) { // 回调记录 $ret_arr = []; $ret_arr['transaction_id'] = isset($message['trade_no']) ?$message['trade_no']: ''; $ret_arr['trade_no'] = isset($message['out_trade_no']) ?$message['out_trade_no']: ''; $ret_arr['return_code'] = isset($message['trade_status']) ?$message['trade_status']: ''; $ret_arr['result_code'] = isset($message['trade_status']) ?$message['trade_status']: ''; $ret_arr['create_at'] = date('Y-m-d H:i:s'); $ret_arr['order_table'] = $table_name; $ret_arr['result'] = json_encode($message); $ret_arr['pay_type'] = 'zfb'; Db::name('order_pay_result')->insert($ret_arr); } }