Commit 386b460e authored by 蔡闯's avatar 蔡闯

2020-1-6

parent 64f679eb

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

*
!.gitignore
\ No newline at end of file
<?php
class JSMS {
const URL = 'https://api.sms.jpush.cn/v1/';
private $options;
private $appKey = "7cb29ca79f936510847b7bc6";
private $masterSecret = "8b1c955df362e317b987554c";
private $temp_arr = [
"185521" => "您的小区{{village_name}},收到一条访客记录,请前往{{app_name}}查看!",
"179812" => "尊敬的{{user_tye}},您好,系统检测到{{address}},[{{type}}],请尽快确认处理",
"165103" => "您的手机验证码:{{code}},有效期五分钟,请勿泄露。如非本人操作,请忽略此短信,谢谢!",
"164542" => "您位于{{msg}},请留意访客",
"185665" => "您在{{village_name}}申请的访客记录已通过,可以人脸识别进入小区,请您知晓",
"185664"=> "您的小区审核查看码:{{code}},可以在访客机上查看审核状态。",
];
public function __construct($appKey='', $masterSecret='', array $options = array()) {
if(!empty($appKey) || !empty($masterSecret)){
$this->appKey = $appKey;
$this->masterSecret = $masterSecret;
}
$this->options = array_merge([
'ssl_verify' => false,
'disable_ssl' => false
], $options);
}
public function sendCode($mobile, $temp_id, $sign_id = null) {
$url = self::URL . 'codes';
$body = array('mobile' => $mobile, 'temp_id' => $temp_id);
if (isset($sign_id)) {
$body['sign_id'] = $sign_id;
}
return $this->request('POST', $url, $body);
}
public function sendVoiceCode($mobile, $options = []) {
$url = self::URL . 'voice_codes';
$body = array('mobile' => $mobile);
if (!empty($options)) {
if (is_array($options)) {
$body = array_merge($options, $body);
} else {
$body['ttl'] = $options;
}
}
return $this->request('POST', $url, $body);
}
public function checkCode($msg_id, $code) {
$url = self::URL . 'codes/' . $msg_id . "/valid";
$body = array('code' => $code);
return $this->request('POST', $url, $body);
}
public function sendMessage($mobile, $temp_id, array $temp_para = [], $time = null, $sign_id = null) {
$path = 'messages';
$body = array(
'mobile' => $mobile,
'temp_id' => $temp_id,
);
if (!empty($temp_para)) {
$body['temp_para'] = $temp_para;
}
if (isset($time)) {
$path = 'schedule';
$body['send_time'] = $time;
}
if (isset($sign_id)) {
$body['sign_id'] = $sign_id;
}
$url = self::URL . $path;
return $this->request('POST', $url, $body);
}
public function sendBatchMessage($temp_id, array $recipients, $time = null, $sign_id = null, $tag = null) {
$path = 'messages';
foreach ($recipients as $mobile => $temp_para) {
$r[] = array(
'mobile' => $mobile,
'temp_para' => $temp_para
);
}
$body = array(
'temp_id' => $temp_id,
'recipients' => $r
);
if (isset($time)) {
$path = 'schedule';
$body['send_time'] = $time;
}
if (isset($sign_id)) {
$body['sign_id'] = $sign_id;
}
if (isset($tag)) {
$body['tag'] = $tag;
}
$url = self::URL . $path . '/batch';
return $this->request('POST', $url, $body);
}
public function showSchedule($scheduleId) {
$url = self::URL . 'schedule/' . $scheduleId;
return $this->request('GET', $url);
}
public function deleteSchedule($scheduleId) {
$url = self::URL . 'schedule/' . $scheduleId;
return $this->request('DELETE', $url);
}
public function getAppBalance() {
$url = self::URL . 'accounts/app';
return $this->request('GET', $url);
}
public function request($method, $url, $body = [], $headers = [], $uploads = []) {
$ch = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_HTTPHEADER => array_merge(array(
'Connection: Keep-Alive'
), $headers),
CURLOPT_USERAGENT => 'JSMS-API-PHP-CLIENT',
CURLOPT_CONNECTTIMEOUT => 20,
CURLOPT_TIMEOUT => 120,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_USERPWD => $this->appKey . ":" . $this->masterSecret,
CURLOPT_URL => $url,
CURLOPT_CUSTOMREQUEST => $method,
);
if (!$this->options['ssl_verify']
|| (bool) $this->options['disable_ssl']) {
$options[CURLOPT_SSL_VERIFYPEER] = false;
$options[CURLOPT_SSL_VERIFYHOST] = 0;
}
if (in_array('Content-Type: multipart/form-data', $options[CURLOPT_HTTPHEADER])) {
$options[CURLOPT_POSTFIELDS] = array_merge($body, $uploads);
if (class_exists('\CURLFile')) {
$options[CURLOPT_SAFE_UPLOAD] = true;
} else {
if (defined('CURLOPT_SAFE_UPLOAD')) {
$options[CURLOPT_SAFE_UPLOAD] = false;
}
}
} else {
$options[CURLOPT_HTTPHEADER][] = 'Content-Type: application/json';
if (!empty($body)) {
$options[CURLOPT_POSTFIELDS] = json_encode($body);
}
}
curl_setopt_array($ch, $options);
$output = curl_exec($ch);
if($output === false) {
return "Error Code:" . curl_errno($ch) . ", Error Message:".curl_error($ch);
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header_text = substr($output, 0, $header_size);
$body = substr($output, $header_size);
$headers = array();
foreach (explode("\r\n", $header_text) as $i => $line) {
if (!empty($line)) {
if ($i === 0) {
$headers[0] = $line;
} else if (strpos($line, ": ")) {
list ($key, $value) = explode(': ', $line);
$headers[$key] = $value;
}
}
}
$response['headers'] = $headers;
$response['body'] = json_decode($body, true);
$response['http_code'] = $httpCode;
}
curl_close($ch);
return $response;
}
}
<?php
class AlipayApp
{
protected $order_info;
protected $pay_money;
protected $pay_type;
protected $is_mobile;
protected $user_info;
protected $config;
public function __construct($order_info=array(),$pay_money=0,$pay_type='alipay',$pay_config=array(),$user_info=array(),$is_mobile=0)
{
$this->order_info = $order_info;
$this->pay_money = $pay_money;
$this->pay_type = $pay_type;
$this->is_mobile = $is_mobile;
$this->user_info = $user_info;
$this->config = array(
// 应用ID,您的APPID。
'app_id' => $pay_config['new_pay_alipay_app_appid'],
// 商户私钥,您的原始格式RSA私钥
'alipay_private_key' => $pay_config['new_pay_alipay_app_private_key'],
// 异步通知地址
'notify_url' => C('config.site_url') . '/source/appapi_alipay_notice.php',
// 异步通知地址
'h5_notify_url' => C('config.site_url') . '/source/appapi_alipayh5_notice.php',
// 同步跳转
'return_url' => C('config.site_url') . '/source/appapi_alipay_return.php',
// 编码格式
'charset' => "UTF-8",
// 签名方式
'sign_type' => 'RSA2',
// 支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => $pay_config['new_pay_alipay_app_public_key']
);
}
public function pay()
{
// if ($this->is_mobile==2 && $_POST['app_type'] != 'packapp') {
if ($this->is_mobile==2 ) {
return $this->app_pay();
} else if($this->is_mobile) {
return $this->mobile_pay();
} else {
return $this->web_pay();
}
}
public function mobile_pay()
{
import('@.ORG.pay.AlipayNew.aop.AopClient','','.php');
import('@.ORG.pay.AlipayNew.aop.SignData','','.php');
import('@.ORG.pay.AlipayNew.aop.request.AlipayTradeCreateRequest','','.php');
import('@.ORG.pay.AlipayNew.aop.AlipayTradeRefundRequest','','.php');
$aop = new AopClient();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $this->config['app_id'];
$aop->rsaPrivateKey = $this->config['alipay_private_key'];
$aop->alipayrsaPublicKey=$this->config['alipay_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='utf-8';
$aop->format='json';
$request = new AlipayTradeCreateRequest();
$biz_content = array(
'timeout_express' => "1d",
'out_trade_no' => $this->order_info['order_type'].'_'. $this->order_info['order_id'],
'product_code' => 'FACE_TO_FACE_PAYMENT',
'total_amount' => $this->pay_money,
'subject' => '订单编号' . $this->order_info['order_id'],
'body' => '订单编号' . $this->order_info['order_id'],
);
session_start();
if($_SESSION['alipay_uid']){
$biz_content['buyer_id'] = $_SESSION['alipay_uid'];
}
$request->setBizContent(json_encode($biz_content,JSON_UNESCAPED_UNICODE));
if($_POST['app_type'] == 'packapp'){
$request->setNotifyUrl($this->config['h5_notify_url']);
}
else{
$request->setNotifyUrl($this->config['notify_url']);
}
$result = $aop->execute ( $request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode) && $resultCode == 10000){
return ['error'=>0, 'tradeNO'=>$result->$responseNode->trade_no];
} else {
return ['error'=>1, 'msg'=>'发起支付失败。' . $result->$responseNode->msg];
echo "失败";
}
}
public function app_pay()
{
import('@.ORG.pay.AlipayNew.aop.AopClient','','.php');
import('@.ORG.pay.AlipayNew.aop.SignData','','.php');
import('@.ORG.pay.AlipayNew.aop.request.AlipayTradeAppPayRequest','','.php');
import('@.ORG.pay.AlipayNew.aop.AlipayTradeRefundRequest','','.php');
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $this->config['app_id'];
$aop->rsaPrivateKey = $this->config['alipay_private_key'];
$aop->alipayrsaPublicKey=$this->config['alipay_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='utf-8';
$aop->format='json';
$request = new AlipayTradeAppPayRequest ();
$request->setBizContent("{" .
"\"total_amount\":\"".$this->pay_money."\"," .
"\"subject\":\"订单编号".$this->order_info['order_id']."\"," .
"\"out_trade_no\":\"".$this->order_info['order_type']."_".$this->order_info['order_id']."\"" .
" }");
//https://001.ruer.coboriel.com/source/appapi_alipay_notice.php
$request->setNotifyUrl($this->config['notify_url']);
// $biz_content = array(
// 'timeout_express' => "1d",
// 'out_trade_no' => $this->order_info['order_type'].'_'. $this->order_info['orderid'],
// 'product_code' => 'QUICK_MSECURITY_PAY',
// 'total_amount' => $this->pay_money,
// 'subject' => '订单编号' . $this->order_info['order_id'],
// 'body' => '订单编号' . $this->order_info['order_id'],
// );
// $request->setBizContent(json_encode($biz_content,JSON_UNESCAPED_UNICODE));
// $request->setNotifyUrl($this->config['notify_url']);
// $request->setReturnUrl($this->config['return_url']);
$response = $aop->sdkExecute($request);
// echo htmlspecialchars($response);exit;
return ['error'=>0, 'orderStr'=>($response)];
// $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
// $resultCode = $result->$responseNode->code;
// if(!empty($resultCode)&&$resultCode == 10000){
// } else {
// echo "失败";
// }
}
// 异步通知
public function notice_url()
{
if ($this->is_mobile) {
return $this->mobile_notice();
} elseif ($this->is_mobile == 2) {
return $this->app_notice();
} else {
return $this->web_notice();
}
}
public function refund()
{
import('@.ORG.pay.Aop.AopClient');
import('@.ORG.pay.Aop.SignData');
import('@.ORG.pay.Aop.AlipayTradePayRequest');
import('@.ORG.pay.Aop.AlipayTradeRefundRequest');
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $this->config['app_id'];
$aop->rsaPrivateKey = $this->config['alipay_private_key'];
$aop->alipayrsaPublicKey=$this->config['alipay_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset="UTF-8";
$aop->format='json';
$request = new AlipayTradeRefundRequest ();
$out_trade_no = $this->order_info['order_type'].'_'. $this->order_info['orderid'];
$trade_no = $this->order_info['third_id'];
$payment_money_order = M("Payment_money_order")->where(['orderid' => $this->order_info['orderid'],'order_type'=>$this->order_info['order_type']])->find();
/*if($payment_money_order && $payment_money_order['pay_rate'] > 0){
$this->pay_money = getFormatNumber($payment_money_order['pay_rate'] * $this->pay_money);
}*/
$reqData = [
'out_trade_no' => $out_trade_no,
'trade_no' => $trade_no,
'refund_amount' => $this->pay_money,
'refund_reason' => '正常退款',
'out_request_no' => $out_trade_no . '_' . $_SERVER['REQUEST_TIME']
];
$request->setBizContent((string)json_encode($reqData));
$result = $aop->execute ( $request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
return array('error'=>0,'type'=>'ok','msg'=>'退款申请成功!请注意查收“支付宝”给您发的退款通知。','refund_param'=> $result->$responseNode->msg);
} else {
fdump_sql(['req' => $reqData, 'resp' => $result], 'AlipayApp_refund_fail');
return array('error'=>1,'type'=>'fail','msg'=>'退款申请失败!如果重试多次还是失败请联系系统管理员。' . $result->$responseNode->msg.($result->$responseNode->sub_msg ? '(业务错误信息:'.$result->$responseNode->sub_msg.')' : ''),'refund_param'=> $result->$responseNode->msg.($result->$responseNode->sub_msg ? '(业务错误信息:'.$result->$responseNode->sub_msg.')' : ''));
}
}
}
?>
\ No newline at end of file
<?php
/**
* 多媒体文件客户端
* @author yikai.hu
* @version $Id: AlipayMobilePublicMultiMediaClient.php, v 0.1 Aug 15, 2014 10:19:01 AM yikai.hu Exp $
*/
include("AlipayMobilePublicMultiMediaExecute.php");
class AlipayMobilePublicMultiMediaClient
{
private $DEFAULT_CHARSET = 'UTF-8';
private $METHOD_POST = "POST";
private $METHOD_GET = "GET";
private $SIGN = 'sign'; //get name
private $timeout = 10;// 超时时间
private $serverUrl;
private $appId;
private $privateKey;
private $prodCode;
private $format = 'json'; //todo
private $sign_type = 'RSA'; //todo
private $charset;
private $apiVersion = "1.0";
private $apiMethodName = "alipay.mobile.public.multimedia.download";
private $media_id = "L21pZnMvVDFQV3hYWGJKWFhYYUNucHJYP3Q9YW13ZiZ4c2lnPTU0MzRhYjg1ZTZjNWJmZTMxZGJiNjIzNDdjMzFkNzkw575";
//此处写死的,实际开发中,请传入
private $connectTimeout = 3000;
private $readTimeout = 15000;
function __construct($serverUrl = '', $appId = '', $partner_private_key = '', $format = '', $charset = 'GBK')
{
$this->serverUrl = $serverUrl;
$this->appId = $appId;
$this->privateKey = $partner_private_key;
$this->format = $format;
$this->charset = $charset;
}
/**
* getContents 获取网址内容
* @param $request
* @return text | bin
*/
public function getContents()
{
$datas = array(
"app_id" => $this->appId,
"method" => $this->METHOD_POST,
"sign_type" => $this->sign_type,
"version" => $this->apiVersion,
"timestamp" => date('Y-m-d H:i:s'),//yyyy-MM-dd HH:mm:ss
"biz_content" => '{"mediaId":"' . $this->media_id . '"}',
"charset" => $this->charset
);
//要提交的数据
$data_sign = $this->buildGetUrl($datas);
$post_data = $data_sign;
//初始化 curl
$ch = curl_init();
//设置目标服务器
curl_setopt($ch, CURLOPT_URL, $this->serverUrl);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
if ($this->METHOD_POST == 'POST') {
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $output;
$datas = explode("\r\n\r\n", $output, 2);
$header = $datas[0];
if ($httpCode == '200') {
$body = $datas[1];
} else {
$body = '';
}
return $this->execute($header, $body, $httpCode);
}
/**
*
* @param $request
* @return text | bin
*/
public function execute($header = '', $body = '', $httpCode = '')
{
$exe = new AlipayMobilePublicMultiMediaExecute($header, $body, $httpCode);
return $exe;
}
public function buildGetUrl($query = array())
{
if (!is_array($query)) {
//exit;
}
//排序参数,
$data = $this->buildQuery($query);
// 私钥密码
$passphrase = '';
$key_width = 64;
//私钥
$privateKey = $this->privateKey;
$p_key = array();
//如果私钥是 1行
if (!stripos($privateKey, "\n")) {
$i = 0;
while ($key_str = substr($privateKey, $i * $key_width, $key_width)) {
$p_key[] = $key_str;
$i++;
}
} else {
//echo '一行?';
}
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . implode("\n", $p_key);
$privateKey = $privateKey . "\n-----END RSA PRIVATE KEY-----";
//私钥
$private_id = openssl_pkey_get_private($privateKey, $passphrase);
// 签名
$signature = '';
if ("RSA2" == $this->sign_type) {
openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA256);
} else {
openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA1);
}
openssl_free_key($private_id);
//加密后的内容通常含有特殊字符,需要编码转换下
$signature = base64_encode($signature);
$signature = urlencode($signature);
//$signature = 'XjUN6YM1Mc9HXebKMv7GTLy7gmyhktyOgKk2/Jf+cz4DtP6udkzTdpkjW2j/Z4ZSD7xD6CNYI1Spz4yS93HPT0a5X9LgFWYY8SaADqe+ArXg+FBSiTwUz49SE//Xd9+LEiIRsSFkbpkuiGoO6mqJmB7vXjlD5lx6qCM3nb41wb8=';
$out = $data . '&' . $this->SIGN . '=' . $signature;
return $out;
}
/*
* 查询参数排序 a-z
* */
public function buildQuery($query)
{
if (!$query) {
return null;
}
//将要 参数 排序
ksort($query);
//重新组装参数
$params = array();
foreach ($query as $key => $value) {
$params[] = $key . '=' . $value;
}
$data = implode('&', $params);
return $data;
}
}
<?php
/**
* 多媒体文件客户端
* @author yuanwai.wang
* @version $Id: AlipayMobilePublicMultiMediaExecute.php, v 0.1 Aug 15, 2014 10:19:01 AM yuanwai.wang Exp $
*/
//namespace alipay\api ;
class AlipayMobilePublicMultiMediaExecute
{
private $code = 200;
private $msg = '';
private $body = '';
private $params = '';
private $fileSuffix = array(
"image/jpeg" => 'jpg', //+
"text/plain" => 'text'
);
/*
* @$header : 头部
* */
function __construct($header, $body, $httpCode)
{
$this->code = $httpCode;
$this->msg = '';
$this->params = $header;
$this->body = $body;
}
/**
*
* @return text | bin
*/
public function getCode()
{
return $this->code;
}
/**
*
* @return text | bin
*/
public function getMsg()
{
return $this->msg;
}
/**
*
* @return text | bin
*/
public function getType()
{
$subject = $this->params;
$pattern = '/Content\-Type:([^;]+)/';
preg_match($pattern, $subject, $matches);
if ($matches) {
$type = $matches[1];
} else {
$type = 'application/download';
}
return str_replace(' ', '', $type);
}
/**
*
* @return text | bin
*/
public function getContentLength()
{
$subject = $this->params;
$pattern = '/Content-Length:\s*([^\n]+)/';
preg_match($pattern, $subject, $matches);
return (int)(isset($matches[1]) ? $matches[1] : '');
}
public function getFileSuffix($fileType)
{
$type = isset($this->fileSuffix[$fileType]) ? $this->fileSuffix[$fileType] : 'text/plain';
if (!$type) {
$type = 'json';
}
return $type;
}
/**
*
* @return text | bin
*/
public function getBody()
{
//header('Content-type: image/jpeg');
return $this->body;
}
/**
* 获取参数
* @return text | bin
*/
public function getParams()
{
return $this->params;
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?php
/**
* 加密工具类
*
* User: jiehua
* Date: 16/3/30
* Time: 下午3:25
*/
/**
* 加密方法
* @param string $str
* @return string
*/
function encrypt($str, $screct_key)
{
//AES, 128 模式加密数据 CBC
$screct_key = base64_decode($screct_key);
$str = trim($str);
$str = addPKCS7Padding($str);
//设置全0的IV
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = str_repeat("\0", $iv_size);
$encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypt_str);
}
/**
* 解密方法
* @param string $str
* @return string
*/
function decrypt($str, $screct_key)
{
//AES, 128 模式加密数据 CBC
$str = base64_decode($str);
$screct_key = base64_decode($screct_key);
//设置全0的IV
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = str_repeat("\0", $iv_size);
$decrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC, $iv);
$decrypt_str = stripPKSC7Padding($decrypt_str);
return $decrypt_str;
}
/**
* 填充算法
* @param string $source
* @return string
*/
function addPKCS7Padding($source)
{
$source = trim($source);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
}
/**
* 移去填充算法
* @param string $source
* @return string
*/
function stripPKSC7Padding($source)
{
$char = substr($source, -1);
$num = ord($char);
if ($num == 62) return $source;
$source = substr($source, 0, -$num);
return $source;
}
\ No newline at end of file
<?php
/**
* TODO 补充说明
*
* User: jiehua
* Date: 16/3/30
* Time: 下午8:55
*/
class EncryptParseItem
{
public $startIndex;
public $endIndex;
public $encryptContent;
}
\ No newline at end of file
<?php
/**
* TODO 补充说明
*
* User: jiehua
* Date: 16/3/30
* Time: 下午8:51
*/
class EncryptResponseData
{
public $realContent;
public $returnContent;
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: jiehua
* Date: 15/5/2
* Time: 下午6:21
*/
class SignData
{
public $signSourceData = null;
public $sign = null;
}
\ No newline at end of file
SDK版本升级说明
1、去除已经放弃维护的lotusphp框架
2、公私钥模式开发者请直接初始化AopClient,使用方法详见:aop/test/AopClientTest.php
3、证书模式开发者请直接初始化AopCertClient,使用方法详见:aop/test/AopCertClientTest.php
4、兼容PHP7.2以上版本
使用过程中有任何问题,请加入钉钉群咨询:23311489
更新时间:2020-04-15
备注:
使用证书模式本地必须开始SSL
如果出现SSL certificate: unable to get local issuer certificate错误信息
解决办法:到http://curl.haxx.se/ca/cacert.pem下载pem文件,并将文件拷贝到D:\phpStudy\PHPTutorial\cacert.pem 在php.ini 增加curl.cainfo = "D:\phpStudy\PHPTutorial\cacert.pem"
\ No newline at end of file
<?php
/**
* ALIPAY API: aft.aifin.fireeye.ocr.image.query request
*
* @author auto create
* @since 1.0, 2019-01-07 20:51:15
*/
class AftAifinFireeyeOcrImageQueryRequest
{
/**
* OCR火眼识别
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "aft.aifin.fireeye.ocr.image.query";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: aft.finsecure.riskplus.security.policy.query request
*
* @author auto create
* @since 1.0, 2019-01-07 20:51:15
*/
class AftFinsecureRiskplusSecurityPolicyQueryRequest
{
/**
* 策略咨询服务输出
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "aft.finsecure.riskplus.security.policy.query";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: alios.open.auto.info.query request
*
* @author auto create
* @since 1.0, 2020-07-13 11:31:44
*/
class AliosOpenAutoInfoQueryRequest
{
/**
* 查询阿里车的车辆信息
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "alios.open.auto.info.query";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: alipay.account.exrate.advice.accept request
*
* @author auto create
* @since 1.0, 2019-01-07 20:51:15
*/
class AlipayAccountExrateAdviceAcceptRequest
{
/**
* 标准的兑换交易受理接口
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "alipay.account.exrate.advice.accept";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: alipay.account.exrate.allclientrate.query request
*
* @author auto create
* @since 1.0, 2019-09-27 17:03:52
*/
class AlipayAccountExrateAllclientrateQueryRequest
{
/**
* 查询客户的所有币种对最新有效汇率
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "alipay.account.exrate.allclientrate.query";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: alipay.account.exrate.ratequery request
*
* @author auto create
* @since 1.0, 2019-01-07 20:51:15
*/
class AlipayAccountExrateRatequeryRequest
{
/**
* 对于部分签约境内当面付的商家,为了能够在境外进行推广,因此需要汇率进行币种之间的转换,本接口提供此业务场景下的汇率查询服务
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "alipay.account.exrate.ratequery";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: alipay.account.exrate.traderequest.create request
*
* @author auto create
* @since 1.0, 2019-01-07 20:51:15
*/
class AlipayAccountExrateTraderequestCreateRequest
{
/**
* 受理外汇交易请求
**/
private $bizContent;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setBizContent($bizContent)
{
$this->bizContent = $bizContent;
$this->apiParas["biz_content"] = $bizContent;
}
public function getBizContent()
{
return $this->bizContent;
}
public function getApiMethodName()
{
return "alipay.account.exrate.traderequest.create";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
<?php
/**
* ALIPAY API: alipay.acquire.cancel request
*
* @author auto create
* @since 1.0, 2019-03-08 15:29:11
*/
class AlipayAcquireCancelRequest
{
/**
* 操作员ID。
**/
private $operatorId;
/**
* 操作员的类型:
0:支付宝操作员
1:商户的操作员
如果传入其它值或者为空,则默认设置为1
**/
private $operatorType;
/**
* 支付宝合作商户网站唯一订单号。
**/
private $outTradeNo;
/**
* 该交易在支付宝系统中的交易流水号。
最短16位,最长64位。
如果同时传了out_trade_no和trade_no,则以trade_no为准。
**/
private $tradeNo;
private $apiParas = array();
private $terminalType;
private $terminalInfo;
private $prodCode;
private $apiVersion="1.0";
private $notifyUrl;
private $returnUrl;
private $needEncrypt=false;
public function setOperatorId($operatorId)
{
$this->operatorId = $operatorId;
$this->apiParas["operator_id"] = $operatorId;
}
public function getOperatorId()
{
return $this->operatorId;
}
public function setOperatorType($operatorType)
{
$this->operatorType = $operatorType;
$this->apiParas["operator_type"] = $operatorType;
}
public function getOperatorType()
{
return $this->operatorType;
}
public function setOutTradeNo($outTradeNo)
{
$this->outTradeNo = $outTradeNo;
$this->apiParas["out_trade_no"] = $outTradeNo;
}
public function getOutTradeNo()
{
return $this->outTradeNo;
}
public function setTradeNo($tradeNo)
{
$this->tradeNo = $tradeNo;
$this->apiParas["trade_no"] = $tradeNo;
}
public function getTradeNo()
{
return $this->tradeNo;
}
public function getApiMethodName()
{
return "alipay.acquire.cancel";
}
public function setNotifyUrl($notifyUrl)
{
$this->notifyUrl=$notifyUrl;
}
public function getNotifyUrl()
{
return $this->notifyUrl;
}
public function setReturnUrl($returnUrl)
{
$this->returnUrl=$returnUrl;
}
public function getReturnUrl()
{
return $this->returnUrl;
}
public function getApiParas()
{
return $this->apiParas;
}
public function getTerminalType()
{
return $this->terminalType;
}
public function setTerminalType($terminalType)
{
$this->terminalType = $terminalType;
}
public function getTerminalInfo()
{
return $this->terminalInfo;
}
public function setTerminalInfo($terminalInfo)
{
$this->terminalInfo = $terminalInfo;
}
public function getProdCode()
{
return $this->prodCode;
}
public function setProdCode($prodCode)
{
$this->prodCode = $prodCode;
}
public function setApiVersion($apiVersion)
{
$this->apiVersion=$apiVersion;
}
public function getApiVersion()
{
return $this->apiVersion;
}
public function setNeedEncrypt($needEncrypt)
{
$this->needEncrypt=$needEncrypt;
}
public function getNeedEncrypt()
{
return $this->needEncrypt;
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment