'测试' ,'zfb' => '支付宝']; public static $PRODUCT = [ 'T888' => [ 'type' => 'test', 'rate' => 0.02, 'max' => 5000, 'min' => 10 ], 'ZPB001' => [ 'type' => 'zfb', 'rate' => 0.085, 'max' => 200, 'min' => 100 ], 'ZPB002' => [ 'type' => 'zfb', 'rate' => 0.057, 'max' => 200, 'min' => 1000 ], 'ZPB003' => [ 'type' => 'zfb', 'rate' => 0.052, 'max' => 1000, 'min' => 3000 ], 'ZPB004' => [ 'type' => 'zfb', 'rate' => 0.042, 'max' => 3000, 'min' => 20000 ], ]; // 获取商户ID public static function getMerchantId() { return config('app.tree_pay_mch_id'); } // 获取商户秘钥 public static function getSecret() { return config('app.tree_pay_key'); } // 获取异步的通知地址 public static function getNotifyUrl() { $host = config('app.url'); return $host.'/api/pay/harvest'; } /** * @description: 获取请求客户端 * @return {*} */ public static function getClient(): Client { return new Client([ 'base_uri' => self::REQUEST_URL, 'timeout' => 5.0, ]); } // 签名 public static function signature($params = [],$must = []) { if($must){ foreach($params as $k => $v){ if(!in_array($k,$must)){ unset($params[$k]); } } } ksort($params, SORT_STRING); $parts = []; foreach($params as $k => $v){ array_push($parts,$k.'='.$v); } $mch_key = self::getSecret(); $parts[] = "key=".$mch_key; $sign = md5(implode('&',$parts)); return $sign; } /** * @description: 发起支付订单 * @param {*} $amount 金额单位分 * @param {*} $orderNo 订单号 * @param {*} $type 支付通道 * @return {*} */ public static function pay($amount,$orderNo,$type = self::PRODUCT_TEST) { $must = ['mchId','productId','outTradeNo','amount','reqTime','notifyUrl']; $mch_id = self::getMerchantId(); $data = []; $data['mchId'] = $mch_id; $data['amount'] = $amount; $data['outTradeNo'] = $orderNo; $data['notifyUrl'] = self::getNotifyUrl(); $data['reqTime'] = time() * 1000; $data['productId'] = $type; $data['sign'] = self::signature($data,$must); $client = self::getClient(); $response = $client->post('api/v1/pay/unifiedOrder', [ 'json' => $data, 'headers' => [ 'Content-Type' => 'application/json', ] ]); $body = $response->getBody(); return json_decode($body->getContents(), true); } }