2023-01-29 10:26:52 +08:00

141 lines
4.7 KiB
PHP

<?php
namespace ThirdPay;
use ThirdPay\Tools;
use think\Db;
class Notify
{
public function Handle($params,$publicKey) {
if(empty($params)){
file_put_contents(ROOT_PATH."pay.log",date('Y-m-d H:i:s')."第三方支付异步通知为空".PHP_EOL,FILE_APPEND);
return false;
}
//$result = $_GET;
//$result = '{"merAccount":"4ec4cffa746042f793e3506223a35e8e","data":"t9mfCRZDe7GB2T\/KAdwtwTj6As4MmMUNpH84S3lS453FwR7BqbOOvdBpMIlDFXFH7KJtwl8uM4IU\n1WGdMUFQeis9yakl5plMBCXIgiPqCvArP1J2lSeRcgxlLsuxMLYzo2VaRQrDVSCusFj7G6CVf1mt\nTbHz8ztuYueq+S44d60++5nH8a05k3wJFJFEXk4qaONvkbtPWx4PLEmyduILoZOjk78kwC7uOW5r\ncg7i1F+qCRaZlOGFG6bEq+lJyM4HN7+m51lfItqaO7\/7qwDdDMXvULlBGVIx2bsDz\/zSJBvlFMFd\n64N34gFbCFVDvKRxhXU8zZcC6BNvEBaExaDR9JcLKxM\/A0IX9qgZX6P2kZIjvsPzTu8TvTrFGdMW\nnYQMnHujeDWq8FPu3neObg5AYH4wljAWliY7Kvr\/fSnPY5Clg2GDOM7Kc6oIFsicPdBxq3NC+zh6\noFzs7IBVHccvqIB1dUiO5WJRonmeXbRBYKtXcCih6eMeSnHsitf+Yo7x","orderId":"CZ_201904121550506337"}';
//$params =json_decode($result,true);
$data = Tools::decryptData($params['data'],$publicKey);
$data = json_decode($data,true);
if(empty($data)){
file_put_contents(ROOT_PATH."pay.log",date('Y-m-d H:i:s')."第三方支付回调解密为空".PHP_EOL,FILE_APPEND);
return false;
}
//去本地服务器检查订单状态
$order = $this->getOrder($data["orderId"]);
if(empty($order)) {
file_put_contents(ROOT_PATH."pay.log",date('Y-m-d H:i:s')."----".$data["orderId"]."本地订单不存在".PHP_EOL,FILE_APPEND);
return false;
}
//检查订单状态
if($this->checkOrderStatus($order)) {
// 如果订单处理过, 则直接返回true
return true;
}
// 订单状态未修改情况下, 进行处理业务
$result = $this->processOrder($order, $data);
if(!$result) {
return false;
}
return $order;
}
// 去本地服务器查询订单信息
public function getOrder($out_trade_no)
{
// 可根据商户订单号进行查询
// 例如:
$order = Db::name('order')->where('out_trade_no', $out_trade_no)->find();
return $order;
}
public function checkOrderStatus($order)
{
// 检查还未修改, 则返回true, 检查已经修改过了, 则返回false
// 例如:
return $order['status'] == 1 ? true : false;
}
/**
* 处理核心业务
* @param array $order 订单信息
* @param array $data 通知数组
* @return Bollean
*/
public function processOrder($order, $data)
{
// 进行核心业务处理, 如更新状态, 发送通知等等
// 处理成功, 返回true, 处理失败, 返回false
$result = Db::name('order')->where('id', $order['id'])->update(['status'=>1, 'transaction_id'=>$data['mbOrderId'],'update_time'=>time()]);
return $result;
}
//回传支付信息
public function transpay($data=array()){
$appSecret = '804ee21f57487c0b8d308f864b56f90c';//钥匙
$trLoginUrl= 'https://lpapi.9944.com/api/comebackgetorderlist';//回传登录信息
$data = array(
'app_name'=>$data['app_name'],
'amount'=>$data['amount'],
'order_id'=>$data['order_id'],
'order_time'=>$data['order_time'],
'openid'=>$data['openid'],
'user_name'=>$data['user_name'],
'reg_time'=>$data['reg_time']
);
$data['sign'] = $this->getSignpay($data,$appSecret);
//var_dump($data);exit;
$ret = $this->curl_get($trLoginUrl,$data);
return $ret;
$retjson = json_decode($ret,true);
}
//签名方式
public function getSignpay($params=array(),$signKey=''){
ksort($params,SORT_REGULAR);
$data = "";
foreach ($params as $key => $value) {
$data .= $key.$value;
}
$sign = strtoupper(md5($signKey.$data));
return $sign;
}
public function curl_get($url='',$param=array()){
if(!is_array($param)){
throw new Exception("参数必须为array");
}
$p='';
foreach($param as $key => $value){
$p=$p.$key.'='.$value.'&';
}
if(preg_match('/\?[\d\D]+/',$url)){//matched ?c
$p='&'.$p;
}else if(preg_match('/\?$/',$url)){//matched ?$
$p=$p;
}else{
$p='?'.$p;
}
$p=preg_replace('/&$/','',$p);
$url=$url.$p;
//echo $url;exit;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
$output = curl_exec($ch);
var_dump($output);
}
}