141 lines
4.7 KiB
PHP
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);
|
|
}
|
|
|
|
|
|
|
|
|
|
} |