当前位置: 首页 > 后端技术 > PHP

PHP实现财务审核通过后返现金额给客户

时间:2023-03-29 16:32:03 PHP

应用场景:有这样一个返现系统,当前端客户发起提现时,后台必须通过返现订单审核后方可现金返还可以返回到客户的帐户中。看看下面的截图。这里的业务场景是要经过两轮审核:销售审核和财务审核通过后,后台会付一笔钱给客户。当然,财务审计也会有很多情况。通关后直接付款的情况很多。具体可以查看微信支付的文档进行更改。看你具体实现微信支付配置的代码1.数据表大致如下`varchar(10)NOTNULLCOMMENT'微信公众平台名称',`token`varchar(100)NOTNULL,`appid`char(18)NOTNULL,`appsecret`char(32)NOTNULL,`access_token`varchar(300)NOTNULL,`api_ticket`varchar(300)DEFAULTNULLCOMMENT'微信卡包api_ticket',`api_ticket_expired_at`datetimeDEFAULTNULLCOMMENT'微信卡包api_ticket过期时间',`mchid`varchar(20)DEFAULTNULLCOMMENT'商户号',`mchkey`varchar(50)DEFAULTNULLCOMMENT'支付密钥',`expired_at`timestampNULLDEFAULTNULLCOMMENT'access_token过期时间,会自动更新',`updated_at`timestampNULLDEFAULTNULLCOMMENT'记录更新时间',`created_at`timestampNULLDEFAULTNULLCOMMENT'创建于',`sort_order`smallint(5)NOTNULLDEFAULT'0'COMMENT'sorted',`points_url`varchar(100)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=11默认字符集=utf8CHECKSUM=1DELAY_KEY_WRITE=1ROW_FORMAT=DYNAMICCOMMENT='微信配置表';2.config配置方法/***获取微信支付配置*这里我把配置信息存储在数据表中方便调用*$param是从controller传过来的value:weixin_config_id,notify_url*@returnarray*/publicfunctiongetWechatConfig($param){$weixin=WeixinConfigBaseModel::find($param['weixin_config_id']);}if(empty($weixin)){thrownewException('微信配置ID错误');}return['wechat'=>[$app_id=>$weixin->appid,'mch_id'=>$weixin->mchid,'notify_url'=>empty($param['notify_url'])?'':$param['notify_url'],//回调url'key'=>$weixin->mchkey,'cert_client'=>resource_path().'/wechat/'.$weixin->id.'/apiclient_cert.pem',//证书和密钥'cert_key'=>resource_path().'/wechat/'.$weixin->id.'/apiclient_key.pem',]];}企业支付给个人更改核心代码/***功能:企业支付到个人找零*作者:cyw0413*@param$openid*@param$trade_no*@param$money*@param$desc*@returnarray*/publicfunctionweixinPay($input){$config=$this->getWechatConfig($input);$params["mch_appid"]=$config['wechat']['app_id'];$params["mchid"]=$config['wechat']['mch_id'];$params["nonce_str"]=date("YmdHis").mt_rand(100,999);$params["partner_trade_no"]=$input['trade_no'];//商家订购单号$params["amount"]=$input['amount'];$params["desc"]=$input['desc'];$params["openid"]=$input['openid'];$params["check_name"]='NO_CHECK';$params['spbill_create_ip']=$_SERVER['SERVER_ADDR'];//生成签名$str='amount='.$params["amount"].'&check_name='.$params["check_name"].'&desc='.$params["desc"].'&mch_appid='.$params["mch_appid"].'&mchid='.$params["mchid"].'&nonce_str='.$params["nonce_str"].'&openid='.$params["openid"].'&partner_trade_no='.$params["partner_trade_no"].'&spbill_create_ip='.$params['spbill_create_ip'].'&key='.$config['wechat']['key'];//md5加密转换成大写$sign=strtoupper(md5($str));//生成签名$params['sign']=$sign;//构造XML数据$xmldata=$this->array_to_xml($params);//数组转XML$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';//发送post请求$res=$this->curl_post_ssl($url,$xmldata,$input['weixin_config_id']);//curl请求if(!$res){thrownew\Exception("服务器连接失败");}//支付结果分析$content=$this->xml_to_array($res);//xml到数组return$content;}/***curlrequest**/publicfunctioncurl_post_ssl($url,$xmldata,$weixin_config_id,$second=30,$aHeader=[]){$ch=curl_init();//超时curl_setopt($ch,CURLOPT_TIMEOUT,$second);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,f);//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');//绝对地址可以用dirname(__DIR__)打印,如果不是绝对地址,会报58错误curl_setopt($ch,CURLOPT_SSLCERT,resource_path().'/wechat/'.$weixin_config_id.'/apiclient_cert.pem');curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLKEY,resource_path().'/wechat/'.$weixin_config_id.'/apiclient_key.pem');如果(count($aHeader)>=1){curl_setopt($ch,CURLOPT_HTTPHEADER,$aHeader);}curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);$data=curl_exec($ch);如果($数据){curl_close($ch);返回$数据;}else{$error=curl_errno($ch);echo"调用失败,errorCode:$error\n";//死();curl_close($ch);返回假;}}/***array转xml*用于生成签名*/publicfunctionarray_to_xml($arr){$str='';foreach($arras$k=>$v){$str.='<'.$k.'>'.$v.'';}$str.='';return$str;}/***xml转化为数组*/publicfunctionxml_to_array($xml){//禁止引用外部xml实体libxml_disable_entity_loader(真);$xmlString=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);$val=json_decode(json_encode($xmlString),true);return$val;}财务审计,即微信返现找零,这时候会返回一个成功的结果,或者各种不成功的结果。这里我用一个方法封装//财务审计if($param['status']==2){//判断返现金额和修改金额if($before_rebate_amount!=$param['rebate_amount']){//如果返现金额不相等,提现金额会变化$out_amount=$param['rebate_amount']-$before_rebate_amount;$this->outMount($business->business_id,$out_amount);}if($param['rebate_status']==9){//财务拒绝通过$business->audit_status=$param['rebate_status'];$business->rebate_amount=$param['rebate_amount'];$business->status=6;$业务->保存();//生成日志$this->insertWithdrawLog($param['withdraw_id'],$business->status,$business->audit_status,$param['rebate_remark'],$param['admin_id']);}else{//提现的各种返回结果$this->payR返回结果($业务,$param);}}/***函数:微信提现返回的各种结果*作者:cyw0413*@param$res*@param$business*@param$param*/publicfunctionpayReturnResult($business,$param){$input=['weixin_config_id'=>20,'openid'=>$business->business->open_id,'amount'=>$param['rebate_amount']*100,'trade_no'=>$business->order_sn,//商户订单号'desc'=>"微信提现"];$pay=newPayLogBaseService();$res=$pay->weixinPay($input);if($res['result_code']=="SUCCESS"){//提现成功$business->audit_status=4;$业务->状态=4;$business->rebate_amount=$param['rebate_amount'];$param['rebate_remark']="已支付(".$param['rebate_amount'].")";}elseif($res['err_code']=="MONEY_LIMIT"){$business->audit_status=3;$业务->状态=3;$param['rebate_remark']="提现失败,已达到支付给该用户的上限";//thrownew\Exception($param['rebate_remark']);}elseif($res['err_code']=="AMOUNT_LIMIT"){$business->audit_status=3;$business->status=3;$param['rebate_remark']="取款失败,低于最低支付金额或高于最高支付金额";//thrownew\Exception($param['rebate_remark']);egdf}elseif($res['err_code']=="NOTENOUGH"){$business->audit_status=3;$business->status=3;$param['rebate_remark']="取款失败,支付账户余额不足或未收到资金";//thrownew\Exception($param['rebate_remark']);}elseif($res['err_code']=="SIGN_ERROR"){$business->audit_status=3;$business->status=3;$param['rebate_remark']="取款失败,签名错误";}elseif($res['err_code']=="PARAM_ERROR"){$business->audit_status=3;$business->status=3;$param['rebate_remark']="提现失败,参数错误";}elseif($res['err_code']=="OPENID_ERROR"){$business->audit_status=3;$业务->状态=3;$param['rebate_remark']="提现失败,Openid错误";}elseif($res['err_code']=="FATAL_ERROR"){$business->audit_status=3;$业务->状态=3;$param['rebate_remark']="提现失败,两次请求参数不一致";}elseif($res['err_code']=="CA_ERROR"){$business->audit_status=3;$业务->状态=3;$param['rebate_remark']="提现失败,商户API证书校验错误";}elseif($res['err_code']=="V2_ACCOUNT_SIMPLE_BAN"){$business->audit_status=3;$业务->状态=3;$param['rebate_remark']="提现失败,无法支付给非实名用户";}else{$business->audit_status=3;$业务->状态=3;$param['rebate_remark']="提现失败,服务器繁忙,请稍后重试";//抛出新的\Exception($param['rebate_remark']);}$business->save();}当微信平台余额不足或者出现各种错误导致提现失败时,还有一个函数支持还款:其实就是点击按钮后调用支付的函数找零,知道支付了是否成功/***功能:还款*作者:cyw0413*@param$param*@throws\Exception*/publicfunctionrepay($param){if(empty($param)){thrownew\Exception("参数错误");$business=GroupBusinessWithdrawBaseModel::find($param['withdraw_id']);if(empty($business)){thrownew\Exception("不存在!");}if($business->audit_status!=3){thrownew\Exception("状态有错误");}//取款各种返回结果$this->payReturnResult($business,$param);}