184 lines
5.6 KiB
PHP
184 lines
5.6 KiB
PHP
<?php
|
||
|
||
namespace App\ServicePay\Sycpay;
|
||
|
||
use Illuminate\Support\Facades\Log;
|
||
|
||
class Sanyecaopay
|
||
{
|
||
protected $token;//token
|
||
protected $mch_id;//商户号
|
||
protected $config;
|
||
static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
|
||
|
||
private function __construct($config)
|
||
{
|
||
$this->token = $config['token'];
|
||
$this->mch_id = $config['mch_id'];
|
||
$this->config = $config;
|
||
|
||
}
|
||
|
||
public static function make($config)
|
||
{
|
||
if (!self::$instance) self::$instance = new self($config);
|
||
return self::$instance;
|
||
}
|
||
|
||
/**
|
||
* 生成签名字符串
|
||
* @param array $requestData 需要签名的数组
|
||
* @param $payKey 私钥
|
||
* @return string
|
||
* @deprecated
|
||
*/
|
||
public function md5Sign( array $requestData = array(),$payKey){
|
||
ksort($requestData);
|
||
$keyVal='';
|
||
foreach ($requestData as $key => $val) {
|
||
$keyVal.=$key."=".$val."&";
|
||
}
|
||
$keyVal=$keyVal."key=".$payKey;
|
||
return strtoupper(md5($keyVal));
|
||
}
|
||
|
||
/**
|
||
* 验证签名
|
||
* @param array $requestData 需要签名的数组
|
||
* @param $payKey 私钥
|
||
* @param $sign 签名结果
|
||
* @return string
|
||
* @deprecated
|
||
*/
|
||
public function md5Verify(array $requestData = array(),$payKey, $sign) {
|
||
ksort($requestData);
|
||
$keyVal='';
|
||
foreach ($requestData as $key => $val) {
|
||
$keyVal.=$key."=".$val."&";
|
||
}
|
||
$keyVal=$keyVal."key=".$payKey;
|
||
$mysgin = strtoupper(md5($keyVal));
|
||
|
||
if($mysgin == $sign) {
|
||
return true;
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 统一下单
|
||
* @param $pay_data
|
||
* @return array
|
||
*/
|
||
public function orderBuy($pay_data)
|
||
{
|
||
// $request = [
|
||
// 'orderNo' => $pay_data['orderNo'], //商户订单号,最大长度60个字符
|
||
// 'customerId' => $pay_data['customerId'], //客户交易者账号
|
||
// 'orderCurrency' => $pay_data['orderCurrency'], //订单币种,固定值:USDT或CNY
|
||
// 'orderAmount' => $pay_data['orderAmount'], //订单金额,USDT单位为个,CNY单位为元
|
||
// 'receiveUrl' => $this->config['notify_url'], // 通知回调地址
|
||
// 'pickupUrl' => $this->config['return_url'] . '?orderNo=' . $pay_data['orderNo'], // 交易完成后跳转URL
|
||
// 'signType' => 'MD5', //固定值不要改
|
||
// ];
|
||
|
||
//商户号
|
||
$accountId = $this->mch_id;
|
||
//商户秘钥
|
||
$key = $this->token;
|
||
$payData=array();
|
||
//商户
|
||
$payData['accountId']=$accountId;
|
||
//支付类型
|
||
$payData['payType']='1';
|
||
//订单号
|
||
$payData['orderId']=$pay_data['orderNo'];
|
||
//商品名称
|
||
$payData['commodity']='商品'.mt_rand(100000,999999);
|
||
//接口参数---其他支付接口参数请查看接口文档
|
||
$payData['interface'] = $this->config['interface'];
|
||
//订单金额(元)
|
||
$payData['amount']=$pay_data['orderAmount'];
|
||
//用户请求ip
|
||
$payData['requestIp']='127.0.0.1';
|
||
//异步回调地址
|
||
$payData['notifyUrl']=$this->config['notify_url'];
|
||
|
||
$sign = $this->md5Sign($payData,$key); //签名
|
||
$payData['sign'] = $sign;
|
||
Log::channel('pay_order')->info(json_encode($payData,true), []);
|
||
$req=$this->httpPost($this->config['url'],$payData);
|
||
return $req;
|
||
}
|
||
|
||
/*
|
||
* 发送对象数据
|
||
* @param $url 请求url
|
||
* @param $jsonStr 发送数组
|
||
* @return string
|
||
*/
|
||
private function httpPost($url, $param)
|
||
{
|
||
if (empty($url) || empty($param)) {
|
||
return false;
|
||
}
|
||
$param = http_build_query($param);
|
||
try {
|
||
$ch = curl_init();//初始化curl
|
||
curl_setopt($ch, CURLOPT_URL, $url);
|
||
curl_setopt($ch, CURLOPT_POST, 1);
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS,$param);
|
||
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
//正式环境时解开注释
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||
$data = curl_exec($ch);//运行curl
|
||
curl_close($ch);
|
||
if (!$data) {
|
||
throw new \Exception('请求出错');
|
||
}
|
||
return $data;
|
||
} catch (\Exception $e) {
|
||
Log::channel('pay_order')->info('$this->config=>'.$e->getMessage(), []);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 检查订单
|
||
* @param $order
|
||
* @return bool|string
|
||
*/
|
||
public function checkOrder($order){
|
||
$url = 'http://www.shanyecaozf.com/gateway/Pay/order_query.html';
|
||
$payData['accountId'] = $this->mch_id;
|
||
$payData['orderId'] = $order['orderNo'];
|
||
$key = $this->token;
|
||
$sign = $this->md5Sign($payData, $key);
|
||
$payData['sign'] = $sign;
|
||
$res = $this->httpPost($url, $payData);
|
||
$res = is_array($res) ? $res : json_decode($res, 256);
|
||
if ($res['status'] == 1) {
|
||
if ($res['data']['trade_status'] == 200 && $res['data']['out_trade_no']==$order['orderNo']) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* @param $para
|
||
* @return bool|mixed
|
||
* @deprecated
|
||
*/
|
||
public function checkSign($para)
|
||
{
|
||
$sign = $para['sign'];
|
||
unset($para['sign']);
|
||
$sign = $this->md5Verify($para, $this->token, $sign);
|
||
return $sign;
|
||
}
|
||
} |