You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
6.1 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Schema;
class XCXApiController extends Controller
{
public static $request;
public static $appid = "13a159e438a742dd932c9bddbfaa41e5";
public static $signType = "OPENAPI-SHA256-RSA2048";
public static $privateKey = "-----BEGIN PRIVATE KEY-----\n"
. "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDGr/KoMftpabe/Mxqm0q6d8GYnNabPiMlPnr
3zQEGzeFSyNp5G8ZD5p6o6taj5Kmg6JPndR0WmNTXr0o5VD6vs3DfbV8wFfHKJDtPYijzUCHXWcef1XyMGOiBFf
ToLVYn+mCoD9dnOy+jBqWg6bQSTOTfX+Uo9/qcxbY5bDv+aPZ7gJYnW6IFN5f/vnw6oPVXehIHhHtv+6/KdLVK
s2aguSlMv9moVlG2MN8Fr0sg4n5szfIT/Kwh7m344WP5eMpYgQuqeJe7sKRKlRqE1SRb8zFGTXviaFEJqH8uDoHD
fw89q786E0NjFHvpcMPoufIRq0dz/5NqC1c/by5zQk+RXAgMBAAECggEBAKbESAik60EvWutBGb2sWKR4g0Wl4
r2PMmmB9C2YYY0iEvUCoxco62ahNGDS2WFKFvG214LDr9IyF3A46v66iLPmo3uX1cdFDV289FNstGHEOCQmt2t
czykK4MtysKWSxqDLV3i7gnXw8QycBMAFgTGRdS3yMD6Y3/y82B/WFvR+B7GgchnBHVMM266D2iXOhS7v6XY
Wjdu1yVRfmyDSw3gI/2FYxVIi/Xb69KlTOjegtVx28/NjCET+quB+BY5osZpHODD5gPX3ltuj7FowaAfaJiUzHoZ8TX
Q8kpXmK2XwResjIBnEcXJMwlruKwZf70j1dmIDQHStLojn90JMdQECgYEA+Y6dCDkG/1RQVZacLGQtZndCdTJ1t
HBs8cGmjlNcpbVo9If8vm6NUbuHYxWDI9pafWjtBLs69II0rwTlgOCFVthCls5F9sChgn0rYgwZskmKqpQvQNyXTP
gHndRLaqyJ7Kk3i2lYObxvpXQgTNxjlHgpQkyvCO5QprfYZgx8b9MCgYEAy9Eff2jsa7EC6Cwv96p7QhFhNcHfMgu
TO8i4b3YEXIVU+X0fKxSY1Rq9RUxL5wkb8/TyT17JOqg0snZs6M6f/jAO1gH611W1q3gaUOQ/naAI/wOJWj7tTa42
hvQFC82IA/zzCOR/RUalQfUX8lNjACOh5+HaXjOn/nIHw7/Bau0CgYEAl/URBYrECgFrEVKuMhGl23jPDNH2/jJfBC
6ono2AIp7+E7giXEqw3o3T+K+GtPQmmaqkeHcRhQUr006l+P29842nrnBYBdJyBiT1n7RCiV9igk/NHi+0KXf2G1
LDwWbibSr02X0B7dYiHZtCd8rTD/rDFM3g3w1OKtZTfIAp3WUCgYAIFfvR6i+29gbPfzFH+hN5w4a/wzk/mwX0UT
o/8caqhP+iBjy+UMrfaXgoz6YTPGFHhGg4jeId2Z59lgUsF0ZxpyZvhxSUhmn2q4UfwG5lqnuw4ksIsYZolojDQdsRZ
M4Imnhp2ebSsMLNoxOYIYbD8qXxtRwcsJ/xkESOl4Ts4QKBgQDYMuU0lCiml1/z8VTpAX91O8gK61vczHZZarhJN
URYZLJgZCnJZXgS/f0BUIYdvhMHLdrHsGPS3HXHEn0oKJyZERbtSGM1UVK9It/Pb+IlWhAZYkajIlM+p5gn8SYorE
27sNjRqoKRKYyy4BfhVGvFSI+Ofyo1yPzhrnRTiSjBjQ==\n"
. "-----END PRIVATE KEY-----";
public static function Api($url_code)
{
$url = 'https://xdfe-api.hnxdfe.com/hisminitest';
// $url = 'https://dqgatjzx-wx.sixinyun.com';
$api['就诊人列表'] = "{$url}/jeecg-boot/hospital/openapi/archive/list";
$api['订单支付'] = "{$url}/PEISCommon/QueryGroups";
$api['订单查询'] = "{$url}/PEISCommon/QueryGroups/460107000001";
$api['订单退款'] = "{$url}/PEISCommon/QueryCombos";
return $api["{$url_code}"] ?? $url_code;
}
public static function Post($url_code, $data)
{
$url = self::Api($url_code);
self::RequestLog($url, $data, $url_code, '小程序接口');
$body_str = self::buildSortedQueryString($data);
$response = Http::withHeaders([
'Authorization' => self::BuildAuthorization('POST', "/jeecg-boot/hospital/openapi/archive/list", $body_str)
])->post($url, $data);
if ($response->successful()) {
// 处理成功的响应
$res_string = json_encode($response->json(), JSON_UNESCAPED_UNICODE);
dd($res_string);
$str_len = mb_strlen($res_string, 'utf-8');
$str_size = $str_len / 1024;
$save_res = $res_string;
if ($str_size > 10) $save_res = '{"data":"Row size too large"}';
self::$request->response_data = $save_res;
self::$request->save();
} else {
// 处理失败的响应
self::$request->response_data = "请求失败";
self::$request->save();
}
}
public static function RequestLog($url, $post_data, $mark, $code = 0)
{
self::CheckTableName();
foreach ($post_data as $key => $post_datum) {
$str_len = mb_strlen(json_encode($post_datum, JSON_UNESCAPED_UNICODE), 'utf-8');
$str_size = $str_len / 1024;
if ($str_size > 10) {
$post_data["$key"] = 'Row size too large';
}
}
$post_data = json_encode($post_data, JSON_UNESCAPED_UNICODE);
self::$request->code = $code;
self::$request->mark = $mark;
self::$request->post_data = $post_data == '[]' ? '{}' : $post_data;
self::$request->request_url = $url;
self::$request->save();
}
public static function CheckTableName()
{
$table_name = 'zz_peis_log_' . date('ym');
$table_count = DB::select('select count(1) as c from information_schema.TABLES where table_schema = ? and table_name = ?', [env('DB_DATABASE'), $table_name])[0];
if ($table_count->c === 0) {
Schema::create($table_name, function (Blueprint $table) {
$table->id();
$table->string('code', 50)->index();
$table->string('mark', 50)->index();
$table->text('post_data');
$table->text('response_data')->nullable();
$table->string('request_url', 300);
$table->timestamps();
});
}
self::$request = new \App\Models\PEISLog();
self::$request->setTable($table_name);
}
//构造请求报文主体 首先将请求报文的参数名按照字典序进行排序,然后用&拼接各个参数
public static function buildSortedQueryString($params)
{
// 1. 按照参数名排序
ksort($params);
// 2. 拼接参数名和参数值
$queryString = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
return $queryString;
}
//计算签名和 Authorization
public static function BuildAuthorization($method, $url, $body)
{
$currentTimestamp = time();
$nonce = md5(uniqid(rand(), true));
$SignStr = $method . '\n' . $url . '\n' . $currentTimestamp . '\n' . $nonce . '\n' . $body . '\n';
// 生成 SHA-256 哈希值
// $hashedData = hash('sha256', $SignStr, true); // true 表示返回二进制格式
// 使用私钥进行 RSA 签名
openssl_sign($SignStr, $signature, self::$privateKey, OPENSSL_ALGO_SHA256);
// 对签名结果进行 Base64 编码
$base64Signature = base64_encode($signature);
$signInfo = 'appid=' . self::$appid . ',nonce=' . $nonce . ',timestamp=' . $currentTimestamp . ',signature=' . $base64Signature;
return self::$signType . ' ' . $signInfo;
}
}