"",/*微信开放平台应用id*/'mch_id'=>"",/*商户微信申请成功后邮件中的id*/'api_key'=>""/*微信商户平台apikey32位自行设置*/);/***@namepay()*@descWeChat支付方式*@paramstring$attach附加数据1代表购物支付,2为充值*@paramstring$body订单描述*@paramstring$out_trade_no订单号*@paramstring$total_fee总金额*@returnjsoncode1二次签名返回参数,前台调用WeChat*@authorzhaoliang*@updatetime2019-8-10*@addtime2019-8-10*/publicfunctionpay($attach,$body,$out_trade_no,$total_fee){$notify_url=$this->notify_url;//回调地址$total_fee=$total_fee*100;//单位是积分,所以乘以100$order=$this->getPrePayOrder($attach,$body,$out_trade_no,$total_fee,$notify_url);//调用方法file_put_contents微信支付('wx1.txt',json_encode($order),FILE_APPEND);if(isset($order['prepay_id'])){//判断返回参数中是否有prepay_id$res['order_arr']=$this->getOrder($order['prepay_id']);//执行二次签名返回参数if(!empty($res['order_arr'])){$res['code']=1;$res['msg']='签名验证成功';}}else{$res['code']=0;$res['msg']='签名验证失败';}返回json_encode($res);}/***@namegetPrePayOrder()*@desc获取预付订单*@paramstring$attach附加描述,1为购物,2为充值*@paramstring$body订单描述*@paramstring$out_trade_no订单号*@paramstring$total_fee总金额*@param[type]$notify_url异步地址*@returnarray微信接口返回签名*@authorzhaoliang*@updatetime2019-8-13*@addtime2019-8-13*/privatefunctiongetPrePayOrder($attach,$body,$out_trade_no,$total_fee,$notify_url){$url=$this->wx_url;$onoce_str=$this->getRandChar(32);$data['attach']=$attach;$data["appid"]=$this->config["appid"];$数据[“正文”]=$正文;$data["mch_id"]=$this->config['mch_id'];$data["nonce_str"]=$onoce_str;$data["notify_url"]=$notify_url;$data["out_trade_no"]=$out_trade_no;$data["spbill_create_ip"]=$this->get_client_ip();$data["total_fee"]=$total_fee;$data["交易类型"]="APP";$s=$this->getSign($data,false);$data["sign"]=$s;$xml=$this->arrayToXml($data);$response=$this->postXmlCurl($xml,$url);//将微信返回的结果xml转换成数组return$this->xmlToArray($response);}//执行二次签名后返回给客户端使用publicfunctiongetOrder($prepayId){$data["appid"]=$这个->配置[“应用程序”];$data["noncestr"]=$this->getRandChar(32);;$data["package"]="Sign=WXPay";$data["partnerid"]=$this->config['mch_id'];$data["prepayid"]=$prepayId;$data["时间戳"]=时间();$s=$this->getSign($data,false);$data["sign"]=$s;return$data;}/**生成一个签名*/privatefunctiongetSign($Obj){foreach($Objas$k=>$v){$Parameters[strtolower($k)]=$v;}//签名步骤一:按照字典顺序对参数进行排序ksort($Parameters);$String=$this->formatBizQueryParaMap($Parameters,false);//签名步骤2:在字符串后添加KEY$String=$String."&key=".$this->config['api_key'];//签名步骤3:MD5加密$result_=strtoupper(md5($String));return$result_;}//获取指定长度的随机字符串privatefunctiongetRandChar($length){$str=null;$strPol="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";$max=strlen($strPol)-1;for($i=0;$i<$length;$i++){$str.=$strPol[rand(0,$max)];//rand($min,$max)生成最小值和最大值之间的随机整数}return$str;}//arraytoxmlprivatefunctionarrayToXml($arr){$xml="";foreach($arras$key=>$val){if(is_numeric($val)){$xml.="<".$key.">".$val."".$key.">";}else$xml.="<".$key.">".$key.">";}$xml.="";return$xml;}//posthttps请求,CURLOPT_POSTFIELDSxml格式privatefunctionpostXmlCurl($xml,$url,$second=30){//初始化curl$ch=curl_init();//超时curl_setopt($ch,CURLOPT_TIMEOUT,$second);curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//设置标题curl_setopt($ch,CURLOPT_HEADER,FALSE);//要求结果为字符串并输出到屏幕curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);//post提交方法curl_setopt($ch,CURLOPT_POST,TRUE);curl_setopt($ch,CURLOPT_POSTFIELDS,$x毫升);//运行curl$data=curl_exec($ch);//返回结果if($data){curl_close($ch);返回$数据;}else{$error=curl_errno($ch);echo"curl错误,错误代码:$error"."
";echo"错误原因查询";curl_close($ch);返回假;}}/*获取当前服务器的IP*/privatefunctionget_client_ip(){if($_SERVER['REMOTE_ADDR']){$cip=$_SERVER['REMOTE_ADDR'];}elseif(getenv("REMOTE_ADDR")){$cip=getenv("REMOTE_ADDR");}elseif(getenv("HTTP_CLIENT_IP")){$cip=getenv("HTTP_CLIENT_IP");}else{$cip="未知";}return$cip;}//将数组转换为uri字符串privatefunctionformatBizQueryParaMap($paraMap,$urlencode){$buff="";ksort($paraMap);foreach($paraMapas$k=>$v){if($urlencode){$v=urlencode($v);}$buff.=strtolower($k).“=”。$v。"&";}$请求参数;如果(strlen($buff)>0){$reqPar=substr($buff,0,strlen($buff)-1);}return$reqPar;}/***将XML转换为数组*@param[type]$data[description]*@return[type][description]*/privatefunctionxmlToArray($data){$arr=json_decode(json_encode(simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOCDATA)),true);return$arr;}/***异步方法*@return[type][description]*/publicfunctionnotify(){//允许从外部加载XML实体(防止XML注入攻击)libxml_disable_entity_loader(true);$postStr=$this->post_data();//接收post数据$arr=$this->xmlToArray($postStr);ksort($arr);#对数据进行排序$str=$this->params_tourl($arr);#将数据拼接成字符串$user_sign=strtoupper(md5($str));//对微信返回的数据重新签名Log::write(json_encode($arr),'log');//输入日志//验证签名if($user_sign==$arr['sign']){//验证签名成功处理商户订单逻辑if($arr['return_code']=='SUCCESS'&&$arr['result_code']=='SUCCESS'){if($arr['attach']==1){//表示购物$return_arr=['pay_type'=>1,//表示微信支付'out_trade_no'=>$arr['out_trade_no'],'total_amount'=>($arr['total_fee']/100)//单位为积分,除以100,支付金额];$res=setOrderPayDoneInfo($return_arr);//购物处理函数,处理成功为trueif($res){//防止接口问题//将收到的数据通知返回给微信return'';}}elseif($arr['attach']==2){//表示充值$return_arr=['payin_sn'=>$arr['out_trade_no'],];$payin_url='http://traceplatform.macdapp.com/api/User_Payin_Log/save_user_notify';$res=$this->valiAddress($payin_url,$return_arr);if($res['code']==1){return'/return_msg>';}}}}else{//如果签名验证失败,微信会再次访问回调方法return'';}}/**@namepost_data()*@desc微信接收异步数据的方法*微信使用$GLOBALS['HTTP_RAW_POST_DATA'];this函数接收post数据*/privatefunctionpost_data(){$receipt=$_REQUEST;如果($receipt==null){$receipt=file_get_contents("php://input");如果($receipt==null){$receipt=$GLOBALS['HTTP_RAW_POST_DATA'];}}返回$receipt;}/***格式化参数格式化成url参数*/privatefunctionparams_tourl($arr){$weipay_key=$this->config['api_key'];//微信key$buff="";foreach($arras$k=>$v){if($k!="sign"&&$v!=""&&!is_array($v)){$buff.=$k.“=”。$v。"&";}}$buff=trim($buff,"&");返回$buff.'&key='.$weipay_key;}}