getMessage(); } } /** * 申请商户 * @return bool|string * @author php迷途小书童 * @created 2021/1/20 15:49 */ public function merchantApply($merchant = []){ $merchantData = []; switch ($merchant['type']) { case 2: $merch_type = "10A"; $imageType = [ "A1" => $merchant['credit_img'],//营业执照图片id ]; $merchantData = [ "bus_license_no"=> $merchant['credit_code'],//营业执照号 ]; break; case 1: $merch_type = "10B"; $imageType = [ "A1" => $merchant['credit_img'],//营业执照图片id ]; $merchantData = [ "bus_license_no"=> $merchant['credit_code'],//营业执照号 ]; break; case 3: $imageType = [ "A7" => "57b9a9aca2bb41a7b35ea882945d230c",//合作协议(首页)图片id "A9" => $merchant['business_premises4'],//合作协议(盖章页)图片id ]; $merch_type = "10C"; break; } try { $data = [ "agent_no" => env('HAIKE.AGENT_NO'),//服务商编号 "agent_apply_no"=> $merchant['agent_apply_no'],//服务商申请单号 "notify_url"=> env('APP_URL')."/api/merchant/apply_notice",//商户审核状态变更后的通知地址 "merchant_data"=> $merchantData + [ "legal_cert_type"=> "1",//法人证件类型 "contact_phone" => $merchant['phone'],//联系人手机号 "merch_type"=> $merch_type,//商户类型10A:个体工商户10B:企业10C:小微商户 "shop_name"=> $merchant['mer_name'],//门店名称 "contact_email"=> $merchant['email'],//联系人邮箱 "merch_name"=> $merchant['mer_name'],//商户全称 "ledger_receive_flag"=> $merchant["haike_receive_flag"],//参与分账业务的收账方标识0:否,1:是。如为空,则默认为:0(v1.18),即为分账方 "contact_name"=> $merchant['name'],//联系人姓名 "legal_cert_no"=> $merchant['legal_cert_no'],//法人证件号 "bus_address"=> $merchant['business_addr'],//营业执照经营地址:详细地址 "merch_short_name"=> $merchant['mer_short_name'],//商户简称 "legal_name"=> $merchant['name'],//法人姓名 "address"=> $merchant['addr'],//实际经营地址:详细地址 "area_code"=> $merchant['area_code'],//实际经营地址:区代码 "city_code"=> $merchant['city_code'],//实际经营地址:市代码 "province_code"=> $merchant['province_code'],//实际经营地址:省代码 "bus_area_code"=> $merchant['area_code'],//营业执照经营地址:区代码 "bus_city_code"=> $merchant['city_code'],//营业执照经营地址:市代码 "bus_province_code"=> $merchant['province_code'],//营业执照经营地址:省代码 "bus_scope_code"=> "00010007"//营业范围代码 ], "bankcard_data"=> [ "acc_name"=> $merchant['acc_type'] == "10A" ? $merchant['mer_name'] : $merchant['name'],//结算账户名称 "bank_code"=> $merchant['bank_code'],//结算账户清算行号 "acc_type"=> $merchant['acc_type'],//结算类型10A:对公10B:对私 "phone"=> $merchant['phone'],//预留手机号 "acc_no"=> $merchant['bank_account'],//结算账户号 "bank_name"=> $merchant['bank_branch'],//结算卡开户银行网点名称 "idcard_no"=> $merchant['idcard_no'],//持卡人身份证号 "bank_city_code"=> $merchant['bank_city_code'],//开户行网点 对应的市代码 "bank_province_code"=> $merchant['bank_province_code'],//开户行网点 对应的省代码 ], "image_data"=> $imageType + [ "A2"=> $merchant['card_positive_person'],//法人身份证正面图片id "A3"=> $merchant['card_back_person'],//法人身份证反面图片id "A4"=> $merchant['card_positive_bank'],//结算卡正面/开户许可证(基本户)图片id "A5"=> $merchant['business_premises1'],//商户门头照图片id "A6"=> $merchant['business_premises2'],//营业场所室内照图片id "A31"=> $merchant['business_premises3'],//营业场所室内照2图片id ], ]; switch ($merchant['is_again']) { case 0: $url = env('HAIKE.HOSTNAME')."/api/v1/merchant/apply"; break; case 1: $url = env('HAIKE.HOSTNAME').'/api/v1/merchant/modify'; $data['merch_no'] = $merchant['merch_no']; break; case 2: $url = env('HAIKE.HOSTNAME').'/api/v1/merchant-modify/apply'; $data['merch_no'] = $merchant['merch_no']; // unset($data['image_data']); break; default: $url = ''; break; } return self::request($data,$url); } catch (\Throwable $e) { Log::info($e->getMessage()); return false; } } /** * 申请商户 * @return bool|string * @author php迷途小书童 * @created 2021/1/20 15:49 */ public function merchantModify($merchant = []){ try { $data = [ "agent_no" => env('HAIKE.AGENT_NO'),//服务商编号 "agent_apply_no"=> $merchant['agent_apply_no'],//服务商申请单号 "notify_url"=> env('APP_URL')."/api/merchant/apply_notice",//商户审核状态变更后的通知地址 "merchant_data"=> [ "merch_name"=> $merchant['mer_name'],//商户全称 "merch_short_name"=> $merchant['mer_short_name'],//商户简称 ], ]; $url = env('HAIKE.HOSTNAME').'/api/v1/merchant-modify/apply'; $data['merch_no'] = $merchant['merch_no']; return self::request($data,$url); } catch (\Throwable $e) { Log::info($e->getMessage()); return false; } } /** * 微信二次认证 * @return bool|string * @author php迷途小书童 * @created 2021/1/28 17:33 */ public function wxAuthApply($merchant = []) { //SUBJECT_TYPE_ENTERPRISE:企业 //SUBJECT_TYPE_INDIVIDUAL:个体工商户 //SUBJECT_TYPE_MICRO:小微商户 switch ($merchant['type']) { case 1: case 2: if ($merchant['type'] == 1) { $subject_type = "SUBJECT_TYPE_ENTERPRISE"; } else { $subject_type = "SUBJECT_TYPE_INDIVIDUAL"; } //主体信息 $subject_info = [ "subject_type" => $subject_type, "business_licence_info" => [//营业执照信息 "licence_number" => $merchant['credit_code'],//营业执照注册号 "licence_copy" => $merchant['credit_img'],//营业执照照片 "merchant_name" => $merchant['mer_name'],//商户名称 "legal_person" => $merchant['name'],//法人姓名 "company_address" => $merchant['business_addr'],//注册地址 "licence_valid_date" => ["1970-01-01","forever"]//营业执照有效日期 ] ]; break; case 3: //主体信息 $subject_info = [ "subject_type" => "SUBJECT_TYPE_MICRO", "assist_prove_info" => [ "micro_biz_type" => "MICRO_TYPE_STORE",//营业执照有效日期 "store_name" => $merchant['mer_name'],//门店名称 "store_address_code" => $merchant['area_code'],//门店省市编码 "store_address" => $merchant['addr'],//门店地址 "store_header_copy" => $merchant['business_premises1'],//门店门头照片 "store_indoor_copy" => $merchant['business_premises2'],//店内环境照片 ] ]; break; } $data = [ "agent_no" => env('HAIKE.AGENT_NO'),//服务商编号 "merch_no" => $merchant['merch_no'],//海科商户编号 "wx_merch_no" => $merchant['wx_merch_no'],//微信商户编号 "business_code" => $merchant['agent_apply_no'],//业务申请编号 "contact_info" => [//联系人信息 "name" => $merchant['name'],//联系人姓名 "mobile" => $merchant['phone'],//联系人手机号 "id_card_number" => $merchant['idcard_no'],//联系人身份证号码 ], "subject_info" => $subject_info, "identification_info" => [ "identification_type" => "IDENTIFICATION_TYPE_IDCARD",//法人证件类型 "identification_name" => $merchant['name'],//证件姓名 "identification_number" => $merchant['idcard_no'],//证件号码 "identification_valid_date" => [$merchant['identification_valid_date_start'], $merchant['identification_valid_date_end']],//证件有效日期 "identification_front_copy" => $merchant['card_positive_person'],//证件正面照片 "identification_back_copy" => $merchant['card_back_person'],//证件反面照片 ] ]; $url = env('HAIKE.HOSTNAME')."/api/v1/wx-auth/apply"; return self::request($data,$url); } /** * 获取商户开户意愿确认状态 * @author php迷途小书童 * @created 2021/1/29 19:38 */ public function queryMerchantAuthStatus($merchant) { $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "wx_merch_no"=> $merchant['wx_merch_no'], ]; $url = env('HAIKE.HOSTNAME')."/api/v1/wx-auth/query-merchant-auth-status"; return self::request($data,$url); } /** * 查询申请单审核结果 * @author php迷途小书童 * @created 2021/1/29 19:38 */ public function queryMerchantApplyStatus($business_code) { $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "business_code"=> $business_code, ]; $url = env('HAIKE.HOSTNAME')."/api/v1/wx-auth/query-apply-status"; return self::request($data,$url); } /** * 结算方式申请及变更 * @return bool|string * @author php迷途小书童 * @created 2021/2/2 17:39 */ public function merchantWithdrawalSetting($merchant = []) { $settlement_cycle = $merchant['settlement_cycle'] ?? 'D1'; $d0_riche_time = $merchant['d0_riche_time'] ?? '15'; $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "settlement_cycle" => $settlement_cycle, 'd0_riche_time' => $d0_riche_time, "withdrawal_rate" => $settlement_cycle != 'D0' ? "0" : "0.2", "withdrawal_feemin" => "0", ]; $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-withdrawal/setting"; return self::request($data,$url); } /** * 商户申请微信业务 * @return bool|string * @author php迷途小书童 * @created 2021/1/27 14:03 */ public function wxApply($merchant) { $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "agent_apply_no"=> $merchant['agent_apply_no'], "notify_url"=> $merchant['apply_notice'], "rate"=> $merchant['rate'], "channel_no"=> env('HAIKE.WX_CHANNEL_NO'), "settle_id"=> $merchant['haike_wx_type'], ]; $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-wx-biz/apply"; return self::request($data,$url); } /** * 支付宝业务申请 * @return bool|string * @author php迷途小书童 * @created 2021/1/27 14:16 */ public function aliApply($merchant) { $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "agent_apply_no"=> $merchant['agent_apply_no'], "notify_url"=> $merchant['apply_notice'], "rate"=> $merchant['rate'], "mcc"=> "0742", "channel_no"=> env('HAIKE.ALI_CHANNEL_NO'), "business_id"=> $merchant['haike_ali_type'], ]; $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-ali-biz/apply"; return self::request($data,$url); } /** * 查询审核信息 * @return bool|string * @author php迷途小书童 * @created 2021/1/27 14:16 */ public function bizQuery($apply = []) { $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "agent_apply_no"=> $apply['agent_apply_no'], "apply_type"=> (string)$apply['apply_type'], ]; $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-biz/query"; return self::request($data,$url); } /** * 查询商户申请信息 * @return bool|string * @author php迷途小书童 * @created 2021/1/27 13:55 */ public function merchantInfo($merchant = []) { $url = env('HAIKE.HOSTNAME')."/api/v1/sub/query-merchant-info"; $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], ]; return self::request($data,$url); } /** * 配置微信公众号 * @return bool|string * @author php迷途小书童 * @created 2021/1/26 17:00 */ public function wxAppidConfAdd($merchant = []) { $url = env('HAIKE.HOSTNAME')."/api/v1/wx-appid-conf/add"; $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "conf_key"=> "pay_appId", "conf_value"=> $merchant['wx_appid'], ]; return self::request($data,$url); } /** * 微信公众号配置查询 * @return bool|string * @author php迷途小书童 * @created 2021/1/26 17:00 */ public function wxAppidQuery($merchant = []) { $url = env('HAIKE.HOSTNAME')."/api/v1/wx-appid-conf/query"; $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], ]; return self::request($data,$url); } /** * 微信费率变更 * @return bool|string * @author php迷途小书童 * @created 2021/1/28 9:19 */ public function wxRateModify($merchant = []) { $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-wx-rate/modify"; $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "agent_apply_no"=> "pay_appId", "rate" => $merchant['wx_rate'], "notify_url"=> "wx66f5f8def2b755da", ]; return self::request($data,$url); } /** * 支付宝费率变更 * @return bool|string * @author php迷途小书童 * @created 2021/1/28 9:19 */ public function aliRateModify($merchant = []) { $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-ali-rate/modify"; $data = [ "agent_no"=> env('HAIKE.AGENT_NO'), "merch_no"=> $merchant['merch_no'], "agent_apply_no"=> "pay_appId", "rate" => $merchant['wx_rate'], "notify_url"=> "wx66f5f8def2b755da", ]; return self::request($data,$url); } /** * 发起支付 * @return bool|string * @author php迷途小书童 * @created 2021/2/5 17:29 */ public function getJsapiPayGateway($order,$notify_url = '/api/jsapiPay/notify') { $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/jsapipay"; $data=[ "accesskey"=> env('HAIKE.ACCESS_KEY'), "trade_type" => $order['trade_type'],//支付方式微信支付:WX 支付宝支付:ALI 银联二维码支付:UNIONQR "merch_no"=> (string)$order['merch_no'],//商户号 "out_trade_no" => $order['out_trade_no'],//商户单号 "total_amount" => (string)$order['money'],//超时时间 "userid" => (string)$order['pay_user_id'],//(支付宝/微信/银联二维码)的用户唯一标识 // "sn" => "WSY196",//厂商终端号 // "pn" => "S0000053",//SAAS终端号 "remark" => "扫码支付",//交易备注 "goods_name" => "扫码支付", "notify_url" => env('APP_URL').$notify_url, ]; if ($order['trade_type'] == 'WX') { $data['appid'] = (string)env('HAIKE.APPID'); } if ($order['type'] == 'mp') { $data['appid'] = (string)$order['appid']; } if ($order['pension'] <= 0) unset($data["ledger_relation"][0]); if ($order['service_money'] <= 0) unset($data["ledger_relation"][0]); // if ($order['pension'] > 0 && $order['service_money'] > 0) { // $data["ledger_relation"] = [ // [//养老金金额 // "receive_no" => "833102358121117", // "amt" => $order['pension'] // ], // [//服务商金额 // "receive_no" => "833102358121123", // "amt" => $order['service_money'] // ] // ]; // } // if ($order['pension'] <= 0 && $order['service_money'] > 0) { // $data["ledger_relation"] = [ // [//服务商金额 // "receive_no" => "833102358121123", // "amt" => $order['service_money'] // ] // ]; // } // if ($order['pension'] > 0 && $order['service_money'] <= 0) { // $data["ledger_relation"] = [ // [//养老金金额 // "receive_no" => "833102358121117", // "amt" => $order['pension'] // ] // ]; // } //分账修改:养老金金额并入服务商金额,修改服务商分账账户为众兴未来 $amt = $order['service_money'] + $order['pension']; $data["ledger_relation"] = [ [//服务商金额 "receive_no" => "833102358121117", "amt" => (string)$amt ] // ,[//养老金金额 // "receive_no" => "833102358121117", // "amt" => $order['pension'] // ] ]; log::info('发起支付:'.json_encode($data)); return self::request($data,$url); } /** * 查询订单API * @return bool|string * @author php迷途小书童 * @created 2021/1/15 16:29 */ public function doQueryOrder($out_trade_no){ $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/query"; $data=[ "out_trade_no" => $out_trade_no ]; $res=self::request($data,$url); return $res; } /** * 关闭订单API * @return bool|string * @author php迷途小书童 * @created 2021/1/15 16:29 */ public function doCloseOrder($out_trade_no){ $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/closeorder"; $data = [ "out_trade_no" => $out_trade_no, ]; return self::request($data,$url); } /** * 申请退款API * @return bool|string * @author php迷途小书童 * @created 2021/1/15 16:32 */ public function doRefundApply($order){ $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/refund"; $data=[ "out_trade_no" => $order['out_trade_no'], "out_refund_no" => $order['refund_no'], "refund_amount" => $order['money'], "notify_url" => env('APP_URL')."/api/jsapiPay/refund_notify", ]; return self::request($data,$url); } /** * 退款查询API * @return bool|string * @author php迷途小书童 * @created 2021/1/15 16:32 */ public function doRefundQuery($refund_no){ $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/refundquery"; $data=[ "refund_no"=> $refund_no ]; return self::request($data,$url); } /** * 账户余额查询 * @return bool|string * @author php迷途小书童 * @created 2021/1/15 16:31 */ public function doBalanceQuery($merch_no){ $url = env('HAIKE.HOSTNAME')."/api/v1/account/balance_query"; $data=[ "merch_no"=> "833226358120003" ]; return self::request($data,$url); } /** * base64图片上传 * @return bool|string * @author php迷途小书童 * @created 2021/1/26 15:50 */ public function uploadImg($base64) { $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-image/upload"; $data = [ "image"=> $base64 ]; return self::request($data,$url); } /** * 回调处理 * @return boolean * @author php迷途小书童 * @created 2021/1/16 14:46 */ public function doNotify(array $data){ $accesskey = env('HAIKE.ACCESS_KEY'); $haikeSign = $data['sign']; unset($data['sign']); $sign = strtoupper(self::getSignContent($data,$accesskey)); if ($sign != $haikeSign) return false; return true; } /** * 生成签名 * @return string * @author php迷途小书童 * @created 2021/1/26 15:50 */ public static function getSignContent($data,$secret_key){ ksort($data); $arrayToBeSigned = []; foreach ($data as $key => $value){ if (is_array($value)) { $sonString = self::sortString($value); $arrayToBeSigned[] = $key . "=" . $sonString; } else { if (true === self::checkEmpty($value)) continue; $arrayToBeSigned[] = $key . "=" . $value; } } $stringToBeSigned = implode("&",$arrayToBeSigned); return md5($stringToBeSigned.$secret_key); } /** * 校验$value是否非空 * @return bool * @author php迷途小书童 * @created 2021/1/26 15:53 */ public static function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } /** * 字符排序 * @return string * @author php迷途小书童 * @created 2021/1/26 15:50 */ public static function sortString($value){ ksort($value); $sonArrayToBeSigned = []; if (is_array($value)) { if (array_keys($value) === range(0, count($value) - 1)) { if (!is_array($value[0])) { foreach ($value as $kindex => $vindex){ $sonArrayToBeSigned[] =$vindex; } return implode("&", $sonArrayToBeSigned); } } } foreach ($value as $k => $v){ if (is_array($v)) { $sonString = self::sortString($v); if (!is_numeric($k)) { $sonArrayToBeSigned[] = $k . "=" . $sonString; } else { $sonArrayToBeSigned[] = $sonString; } } else { if (true === self::checkEmpty($v)) continue; $sonArrayToBeSigned[] = $k . "=" . $v; } } return implode("&", $sonArrayToBeSigned); } /** * @return bool|string * @author php迷途小书童 * @created 2021/1/15 16:32 */ public static function posturl($url,$data){ $json = json_encode($data, JSON_UNESCAPED_UNICODE); $removeUrl = env('HAIKE.HOSTNAME')."/api/v1/merchant-image/upload"; if ($url != $removeUrl) Log::info('【'.$url.'】:'.$json); $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json"); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $json); curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_MAXREDIRS, 10); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); $output = curl_exec($curl); curl_close($curl); return json_decode($output, true); } }