sifangpay/app/ServicePay/Sycpay/Sanyecaopay.php

184 lines
5.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}