下单 ,分账,完结,进件,退款,
<?php
namespace app\admin\controller;
use think\Controller;
class Yibao extends Controller
{
static $privatekey="MIIE**********WyF/Jk5tPObHJWMg==";
static $yopPublicKey ="MIIB*********QAB";
public function _initialize(){
vendor('yibao.lib.YopClient3');
}
public function callback($response){
vendor('yibao.lib.Util.YopSignUtils');
vendor('yibao.lib.YopClient');
$data=\YopSignUtils::decrypt($response,self::$privatekey,self::$yopPublicKey);
return $data;
}
//获取token
public function get_token($trade_no='',$merchantNo=''){
$order=db('order')->where('trade_no',$trade_no)->find();
//判断是否需要分账
$fenrun_group=db('yibao_fenrun_group')->where('uid',$order['owner'])->select();
if(!$fenrun_group){
return '';
}
// $yibao=db('yibao_merchants')->where('uid',$order['owner'])->find();
$request = new \YopRequest($appKey='app_100*****', self::$privatekey);
$notify_url=config('questurl')."/index/yibao/pay_notify";
$request->addParam("parentMerchantNo",'10085795002');
$request->addParam("merchantNo",'10085795002');
$request->addParam("orderId",$trade_no);
if($fenrun_group){
$request->addParam("fundProcessType",'DELAY_SETTLE');
}
$request->addParam("orderAmount",$order['unit_price']);
$request->addParam("goodsName",$order['goods_name']);
$request->addParam("notifyUrl",$notify_url);
$response = \YopClient3::post("/rest/v1.0/trade/order", $request);
$data=object_array($response);
if($order['pay_type']=='微信'){
$pay_tool='WECHAT_OPENID';
}else{
$pay_tool='ZFB_SHH';
}
if($data["result"]['code']=='OPR00000'){
db('order')->where('trade_no',$trade_no)->update(['uniqueOrderNo'=>$data["result"]['uniqueOrderNo'],'merchantNo'=>$merchantNo]);
$pay_data=$this->pay($pay_tool,$data["result"]['token'],$order['openid']);
}
if($pay_data['result']['code']=='CAS00000'){
$data=json_decode($pay_data['result']['resultData'],true);
$asort_data=[
'appId'=>$data['appId'],
'timeStamp'=>$data['timeStamp'],
'nonceStr'=>$data['nonceStr'],
'package'=>$data['package'],
'signType'=>'RSA',
'paySign'=>$data['paySign'],
];
return $asort_data;
}else{
return '';
}
// dump($pay_data);
//return $data["result"]['token'];
}
//下单,聚合支付api
public function pay($pay_tool='WECHAT_OPENID',$token="",$openId=''){
if($pay_tool=='WECHAT_OPENID'){
$pay_type="WECHAT";
}elseif($pay_tool=='ZFB_SHH'){
$pay_type="ALIPAY";
}elseif($pay_tool=='JSPAY'){
$pay_type='UPOP';
}
$extparamMap=['reportFee'=>'XIANXIA'];
$request = new \YopRequest($appKey='app_100*****', self::$privatekey);
$notify_url=config('questurl')."/api/index/pay_notify";
$request->addParam("payTool", $pay_tool);
$request->addParam("payType",$pay_type);
$request->addParam("token",$token);
$request->addParam("appId",config('appid'));
$request->addParam("openId",$openId);
$request->addParam("version",'1.0');
$request->addParam("userIp",'127.0.0.1');
$request->addParam("extParamMap",json_encode($extparamMap));
$response = \YopClient3::post("/rest/v1.0/nccashierapi/api/pay", $request);
$data=object_array($response);
return $data;
}
//申请分账,支付成功结果 5 秒后调用,在异步通知里调用
public function amount_apply($trade_no='',$divideRequestId='',$yibao_trade_no='',$fenrun_group=''){
// $divideDetail=[
// ['ledgerNo'=>'10085742333','amount'=>'0.01','divideDetailDesc'=>'测试结算'],
// ];
$order=db('order')->where('trade_no',$trade_no)->find();
$yibao_trade_no=$order['uniqueOrderNo'];
$fenrun_group=db('admin_order_profit')->where('order_id',$order['id'])->select();
$divideRequestId=$fenrun_group[0]['divideRequestId'];
$divideDetail=[];
foreach($fenrun_group as $v){
$arr=[];
$arr['ledgerNo']=$v['ledgerNo'];
$arr['amount']=$v['amount'];
$arr['divideDetailDesc']='分成结算';
$divideDetail[]=$arr;
}
$order=db('order')->where('trade_no',$trade_no)->find();
$yibao=db('yibao_merchants')->where('uid',$order['owner'])->find();
$request = new \YopRequest($appKey='app_10085795002', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795002');
$request->addParam("merchantNo",'10085795002');
$request->addParam("orderId",$trade_no);
$request->addParam("uniqueOrderNo",$yibao_trade_no);
$request->addParam("divideRequestId",$divideRequestId);
$request->addParam("divideDetail",json_encode($divideDetail));
$response = \YopClient3::post("/rest/v1.0/divide/apply", $request);
$data=object_array($response);
if($data['result']['status']=='SUCCESS'){
$detail=json_decode($data['result']['divideDetail'],true);
foreach($detail as $v){
db('admin_order_profit')->where('order_id',$order['id'])->where('ledgerNo',$v['ledgerNo'])->update(['divideDetailNo'=>$v['divideDetailNo']]);
}
$this->amount_complete($trade_no,$yibao_trade_no,$divideRequestId);
}
// echo(json_encode($data));
//return $data;
}
//完结分单
public function amount_complete($trade_no,$yibao_trade_no,$divideRequestId){
$order=db('order')->where('trade_no',$trade_no)->find();
$request = new \YopRequest($appKey='app_10085795002', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795002');
$request->addParam("merchantNo",'10085795002');
$request->addParam("orderId",$trade_no);
$request->addParam("uniqueOrderNo",$yibao_trade_no);
$request->addParam("divideRequestId",$divideRequestId);
$response = \YopClient3::post("/rest/v1.0/divide/complete", $request);
$data=object_array($response);
if($data['result']['divideStatus']=='SUCCESS'){
db('admin_order_profit')->where('divideRequestId',$divideRequestId)->update(['status'=>'1']);
}
// echo(json_encode($data));
// echo '..........';
}
//分账查询
public function amount_query($trade_no='',$yibao_trade_no='',$divideRequestId=''){
// $trade_no='2012081023012802';
// $divideRequestId='1607394194166';
// $yibao_trade_no='1013202012080000001934058224';
$order=db('order')->where('trade_no',$trade_no)->find();
$request = new \YopRequest($appKey='app_10085795002', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795002');
$request->addParam("merchantNo",'10085795002');
$request->addParam("orderId",$trade_no);
$request->addParam("uniqueOrderNo",$yibao_trade_no);
$request->addParam("divideRequestId",$divideRequestId);
$response = \YopClient3::get("/rest/v1.0/divide/query", $request);
$data=object_array($response);
echo(json_encode($data));
}
//分账资金退还,先申请资金退还,再退款
public function amount_back($trade_no){
$order=db('order')->where('trade_no',$trade_no)->find();
$divideBackRequestId=time().mt_rand(1111,9999);
$refundRequestId=time().mt_rand(1111,9999);
if($order['owner']==1){
db('order')->where('trade_no',$trade_no)->update(['refundRequestId'=>$refundRequestId]);
$data=$this->refund($trade_no,$order['uniqueOrderNo'],$refundRequestId,$order['unit_price']);
return $data;
}else{
$fenrun_group=db('admin_order_profit')->where('order_id',$order['id'])->select();
$divideBackDetail=[];
foreach($fenrun_group as $v){
$arr=[];
$arr=[
'amount'=>$v['amount'],
'divideBackReason'=>'用户退款',
'divideDetailNo'=>$v['divideDetailNo']
];
$divideBackDetail[]=$arr;
}
$request = new \YopRequest($appKey='app_10085795***', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795****');
$request->addParam("merchantNo",'10085795002');
$request->addParam("divideBackRequestId",$divideBackRequestId);
$request->addParam("divideRequestId",$fenrun_group[0]['divideRequestId']);
$request->addParam("orderId",$trade_no);
$request->addParam("uniqueOrderNo",$order['uniqueOrderNo']);
$request->addParam("divideBackDetail",json_encode($divideBackDetail));
$response = \YopClient3::post("/rest/v1.0/divide/back", $request);
$data=object_array($response);
file_put_contents('./fenzhangback.txt',json_encode($data).PHP_EOL,FILE_APPEND);
if($data['result']['status']=='SUCCESS'){
db('order')->where('trade_no',$trade_no)->update(['refundRequestId'=>$refundRequestId,'uniqueDivideBackNo'=>$data['result']['uniqueDivideBackNo']]);
$data=$this->refund($trade_no,$order['uniqueOrderNo'],$refundRequestId,$order['unit_price']);
return $data;
}else{
return $data;
}
}
}
//用户退款,先调用申请分账金额退还,再调用此接口
public function refund($trade_no='',$yibao_trade_no='',$refundRequestId='',$refundAmount=''){
// $trade_no='2012081427496710';
// $yibao_trade_no='1013202012080000001934544161';
$refundRequestId='20201234033322';
// $refundAmount='1';
$refund_noitfy=config('questurl').'/admin/Yibao/refund_notify';
$request = new \YopRequest($appKey='app_10085795002', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795002');
$request->addParam("merchantNo",'10085795002');
$request->addParam("orderId",$trade_no);
$request->addParam("refundRequestId",$refundRequestId);
$request->addParam("uniqueOrderNo",$yibao_trade_no);
$request->addParam("refundAmount",$refundAmount);
$request->addParam("description",'用户申请退款');
$request->addParam("notifyUrl",$refund_noitfy);
$response = \YopClient3::post("/rest/v1.0/trade/refund", $request);
$data=object_array($response);
// echo json_encode($data);
//dump($data);
return $data;
}
public function refund_notify(){
$data=input('');
$res=$this->callback($data['response']);
file_put_contents('./pay_frund.txt',$res.PHP_EOL,FILE_APPEND);
$res=json_decode($res,true);
// var_dump($res);exit;
if($res['status']=='SUCCESS'){
db('order')->where('trade_no',$res['orderId'])->update(['trade_status'=>3]);
}
echo 'SUCCESS';
}
//设置授权目录
public function set_pay_url($mmo){
$tradeAuthDirList=[
"http://www.baidu.com/"
];
$appIdList=[
[
"appId"=>config('appid'),
"appIdType"=>"OFFICIAL_ACCOUNT",
"subscribeAppId"=>config('appid')
]
];
$request = new \YopRequest($appKey='app_10085795**', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795***');
$request->addParam("merchantNo",'10085795002');
$request->addParam("tradeAuthDirList",json_encode($tradeAuthDirList));
$request->addParam("appIdList",json_encode($appIdList));
$response = \YopClient3::post("/rest/v1.0/divide/apply", $request);
$data=object_array($response);
dump($data);
}
//支付结果通知
public function pay_notify(){
file_put_contents('./pay_notify.txt',json_encode(input('')).PHP_EOL,FILE_APPEND);
$data=input('');
$res=$this->callback($data['response']);
$res=json_decode($res,true);
if($res['status']=='SUCCESS'){
$trade_no=$res['orderId'];
//查询回调的次数
$callback_time=db('order')->where('trade_no',$trade_no)->value('callback_time');
if($callback_time<1){
db('order')->where('trade_no',$trade_no)->update(['trade_status'=>'1']);
db('order')->where('trade_no',$trade_no)->setInc('callback_time',1);
//进行出货
}else{
//如果不需要分账
$order=db('order')->where('trade_no',$trade_no)->find();
//判断是否需要分账
$fenrun_group=db('yibao_fenrun_group')->where('uid',$order['owner'])->select();
$fen=[];
if($fenrun_group){
$map['order_id']=$order['id'];
$map['divideRequestId']=time().mt_rand(111,999);
foreach ($fenrun_group as $k=>$v){
$map['admin_id']=$v['fenrun_admin_id'];
$merchantNo=db('yibao_merchants')->where('uid',$v['fenrun_admin_id'])->value('merchantNo');
$map['ledgerNo']=$merchantNo;
$map['amount']=$v['fenrun']*$order['unit_price']*0.01;
db('admin_order_profit')->insert($map);
$fen[$k][]=$map;
}
$this->amount_apply($trade_no,$map['divideRequestId'],$order['uniqueOrderNo'],$fen);
}
echo 'SUCCESS';
}
}
}
public function in_notify(){
file_put_contents('./yibao_micro_notify.txt',date('Y-m-d H:i:s',time()).'<>'.json_encode(input('')).PHP_EOL,FILE_APPEND);
$data=input('');
$res=$this->callback($data['response']);
$res=$this->callback($data['response']);
$res=json_decode($res,true);
if($res['applicationStatus']=='COMPLETED'){
db('yibao_merchants')->where('requestNo',$res['requestNo'])->update(['merchantNo'=>$res['merchantNo']]);
}else{
db('yibao_merchants')->where('requestNo',$res['requestNo'])->update(['agreementSignUrl'=>$res['agreementSignUrl'],'auditOpinion'=>$res['auditOpinion']]);
}
}
public function callback($response){
vendor('yibao.lib.Util.YopSignUtils');
vendor('yibao.lib.YopClient');
$data=\YopSignUtils::decrypt($response,self::$privatekey,self::$yopPublicKey);
return $data;
}
public function hui_no(){
$data=json_decode($data,true);
$res=$this->callback($data['response']);
$res=$this->callback($data['response']);
$res=json_decode($res,true);
dump($res);exit;
if($res['applicationStatus']=='COMPLETED'){
db('yibao_merchants')->where('requestNo',$res['requestNo'])->update(['merchantNo'=>$res['merchantNo']]);
}else{
db('yibao_merchants')->where('requestNo',$res['requestNo'])->update(['agreementSignUrl'=>$res['agreementSignUrl'],'auditOpinion'=>$res['auditOpinion']]);
}
}
public function amount_back_test($trade_no){
$order=db('order')->where('trade_no',$trade_no)->find();
$divideBackRequestId=time().mt_rand(1111,9999);
$refundRequestId=time().mt_rand(1111,9999);
$fenrun_group=db('admin_order_profit')->where('order_id',$order['id'])->select();
$divideBackDetail=[];
foreach($fenrun_group as $v){
$arr=[];
$arr=[
'amount'=>$v['amount'],
'divideBackReason'=>'用户退款',
'divideDetailNo'=>$v['divideDetailNo']
];
$divideBackDetail[]=$arr;
}
$request = new \YopRequest($appKey='app_1008579****', self::$privatekey);
$request->addParam("parentMerchantNo", '10085795****');
$request->addParam("merchantNo",'10085795****');
$request->addParam("divideBackRequestId",$divideBackRequestId);
$request->addParam("divideRequestId",$fenrun_group[0]['divideRequestId']);
$request->addParam("orderId",$trade_no);
$request->addParam("uniqueOrderNo",$order['uniqueOrderNo']);
$request->addParam("divideBackDetail",json_encode($divideBackDetail));
$response = \YopClient3::post("/rest/v1.0/divide/back", $request);
$data=object_array($response);
echo json_encode($data);
}
//商户激活
public function merchant_active(){
if(request()->isAjax() && request()->isPost()){
$id=input('id');
$data=db('yibao_merchants')->where('id',$id)->find();
//判断是小微还是平台 1:小微 2:平台
if($data['type']=='1'){
$data=$this->mirco_active($data);
}else{
$data=$this->platm_active($data);
}
if($data['request']['returnCode']=='NIG00000'){
$arr=['status'=>'1','msg'=>'申请成功'];
}else{
$arr=['status'=>'0','msg'=>$data['result']['returnMsg']];
}
echo json_encode($arr);
exit;
}
}
//小微商户激活
public function mirco_active($data){
vendor('yibao.lib.YopClient3');
$arr=[
'requestNo'=>$data['requestNo'],
'parentMerchantNo'=>$data['parentMerchantNo'],
'merchantSubjectInfo'=>[
'signName'=>$data['signName'],
'shortName'=>$data['shortName']
],
'merchantCorporationInfo'=>[
'legalLicenceType'=>'ID_CARD',
'legalLicenceNo'=>$data['legalLicenceNo'],
'legalLicenceFrontUrl'=>$data['legalLicenceFrontUrl'],
'legalLicenceBackUrl'=>$data['legalLicenceBackUrl'],
'mobile'=>$data['mobile']
],
'businessAddressInfo'=>[
'province'=>$data['province'],
'city'=>$data['city'],
'district'=>$data['district'],
'address'=>$data['address'],
],
'accountInfo'=>[
'bankAccountType'=>'DEBIT_CARD',
'bankCardNo'=>$data['bankCardNo'],
'bankCode'=>$data['bankCode'],
],
'productInfo'=>[
["productCode"=>"T1","rateType"=>"SINGLE_FIXED","fixedRate"=>"0"]
],
'notifyUrl'=>"/index/yibao/in_notify"
];
$request = new \YopRequest($appKey='app_100857**', self::$privatekey);
$request->addParam("requestNo", $data['requestNo']);
$request->addParam("parentMerchantNo",'10085795***');
$request->addParam("merchantSubjectInfo", json_encode($arr['merchantSubjectInfo']));
$request->addParam("merchantCorporationInfo",json_encode($arr['merchantCorporationInfo']));
$request->addParam("businessAddressInfo",json_encode($arr['businessAddressInfo']));
$request->addParam("accountInfo",json_encode($arr['accountInfo']));
$request->addParam("productInfo",json_encode($arr['productInfo']));
$request->addParam("notifyUrl",$arr['notifyUrl']);
$response = \YopClient3::post("/rest/v2.0/mer/register/saas/micro", $request);
$data=object_array($response);
db('yibao_merchants')->where('requestNo',$map['requestNo'])->update(['applicationNo'=>$data['result']['applicationNo']]);
return $data;
//echo json_encode($response);
}
//平台商激活
public function platm_active($data){
vendor('yibao.lib.YopClient3');
$map=[
'requestNo'=>$data['requestNo'],
'parentMerchantNo'=>$data['parentMerchantNo'],
'businessRole'=>$data['type']==2?'PLATFORM_MERCHANT':'SETTLED_MERCHANT',
'merchantSubjectInfo'=>[
'signType'=>$data['signType']=='1'?'INDIVIDUAL':'ENTERPRISE',
'licenceNo'=>$data['licenceNo'],
'licenceUrl'=>$data['licenceUrl'],
'signName'=>$data['signName'],
'shortName'=>$data['shortName'],
'handLicenceUrl'=>$data['handLicenceUrl'],
'openAccountLicenceNo'=>$data['openAccountLicenceNo'],
'openAccountLicenceUrl'=>$data['openAccountLicenceUrl']
],
'merchantCorporationInfo'=>[
'legalName'=>$data['legalName'],
'legalLicenceType'=>'ID_CARD',
'legalLicenceNo'=>$data['legalLicenceNo'],
'legalLicenceFrontUrl'=>$data['legalLicenceFrontUrl'],
'legalLicenceBackUrl'=>$data['legalLicenceBackUrl'],
],
'merchantContactInfo'=>[
'contactName'=>$data['contactName'],
'contactMobile'=>$data['contactMobile'],
'contactEmail'=>$data['contactEmail']
],
'businessAddressInfo'=>[
'province'=>$data['province'],
'city'=>$data['city'],
'district'=>$data['district'],
'address'=>$data['address'],
],
'settlementAccountInfo'=>[
'settlementDirection'=>'BANKCARD',
'bankAccountType'=>$data['bankAccountType'],
'bankCardNo'=>$data['bankCardNo'],
'bankCode'=>$data['bankCode'],
],
'productInfo'=>[
/**
*
* 平台商需要此结算
["productCode"=>"MERCHANT_SCAN_ALIPAY_OFFLINE","rateType"=>"SINGLE_PERCENT","percentRate"=>"0.3"],
["productCode"=>"WECHAT_OFFIACCOUNT_WECHAT_OFFLINE","rateType"=>"SINGLE_PERCENT","percentRate"=>"0.3"],
**/
["productCode"=>"T1","rateType"=>"SINGLE_FIXED","fixedRate"=>"0"]
],
// 'notifyUrl'=>"/api/index/notify"
'notifyUrl'=>"/index/yibao/in_notify"
];
$request = new \YopRequest($appKey='app_100857***', self::$privatekey);
$request->addParam("requestNo", $map['requestNo']);
$request->addParam("parentMerchantNo", '10085795002');
$request->addParam("businessRole", $map['businessRole']);
$request->addParam("merchantSubjectInfo", json_encode($map['merchantSubjectInfo']));
$request->addParam("merchantCorporationInfo", json_encode($map['merchantCorporationInfo']));
$request->addParam("merchantContactInfo", json_encode($map['merchantContactInfo']));
$request->addParam("businessAddressInfo",json_encode($map['businessAddressInfo']));
$request->addParam("settlementAccountInfo",json_encode($map['settlementAccountInfo']));
$request->addParam("productInfo",json_encode($map['productInfo']));
$request->addParam("notifyUrl",$map['notifyUrl']);
$response = \YopClient3::post("/rest/v2.0/mer/register/saas/merchant", $request);
$data=object_array($response);
db('yibao_merchants')->where('requestNo',$map['requestNo'])->update(['applicationNo'=>$data['result']['applicationNo']]);
return $data;
//echo json_encode($response);
}
//上传文件
public function upload_licence(){
$params['file']=input('file');
vendor('yibao.lib.YopClient3');
$request = new \YopRequest($appKey='app_1008574***, self::$privatekey);
// $data=file_get_contents('./'.$params['file']);
// dump($params['file']);
$request->addFile("merQual",'/www/wwwroot/m_apl1986_com/public/'.$params['file']);
$response = \YopRsaClient::upload("/yos/v1.0/sys/merchant/qual/upload", $request);
// $request->addFile("merQual",$params['file']);
// $response = \YopRsaClient::upload("/yos/v1.0/sys/merchant/qual/upload", $request);
$data=object_array($response);
//dump($data);
if($data['state']=='SUCCESS'){
$arr=[
'status'=>'1',
'info'=>$data['result']['merQualUrl']
];
}else{
$arr=[
'status'=>'0',
'info'=>''
];
}
echo json_encode($arr);
exit;
}
}