对接三方支付

main
yanzai 1 month ago
parent be8e7b7040
commit 19a86aaeed

@ -0,0 +1,223 @@
<?php
namespace App\Http\Controllers;
use App\Models\WeChatPay;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Yo;
use function Symfony\Component\String\s;
class TongLianPayController
{
public static $cusid = "56447508999A87S";//商户号 正式
public static $appid = "00352016";//appid 正式
public static $key="MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCS6r706Ogi7FpYV71ccH1jwC2NZGcrWzt1Xw6rJ6+ZEeICQjUWZLPqc/D4fvh3xJPaxIqXlcA5y9xlPVO7hhoVqAKY3uPC519j6IFBxIUYC0fKWZdCpBK/kfcaqZu6ChH+hmawqfwqRjYeIGJLW2xyS8GAxQX6Uj32bZHW0xfl6Ia6lmVZ2pNpO8RS8ExhhuNc4Mm9G72+drQKfj809NNwO7fzNWa6htogszbhcf+n5pBqSzGn6j0RAnq6Eylza8GOt6LXI04KpvglPsvdCgJYK2VdezADG3XjBSdFo7ezyh0YRYVgzEWpAA1bFe6eOJPsMccetxVr/s1PwDXg3kMnAgMBAAECggEARUHpRA3ZhMETs+qkp0OWMKRjNPC8W+l1pZZqlU+vjUKrXvI0EXrmf6MpWRON8PPX2XzmcqATDovmOUmIQ/HrMQNTOhp0lyg4RSJRcJ4COfvzW1YRosYy2mEmcki7Ux+1LN3R4f04FPulPl14yNpvzI+eyCPY9hC4CgfMBM/dR7E3nU/kpesGhfwPs/prXHs9Dy/r6YG7RjSF/QANga8rVFMnQJpxSYBABRVRePtTThTZ8fTgabLpqXOihqhoBSYpt0sP5FK7cMOKJn93H4Y2UbSzcLZRdbm1vjuVILxyHe1XQ72gFbHucy1XbjQ+GKMLaHkXx9ikqjaeg5lQIWpWCQKBgQDCCLGu9p4cy8paRTykf7El0SaPYcsW8JrJqfd5USV/gKNGJ9N+mGxEo+RszD61L5Vufniupzbfepl1kCVJGQ2lqgfJe1r3RToF8PPIvq/IdBfcVpIOeIf6y/JK0OJwBnk4WwTprWIicUDW5Ju+vvddxOL2xAr+f+pZJG79PdYDfwKBgQDB1f0CE3ExhzfznQyLO7T418qXrmzSkp0qi7KS+zNWvamgHNBovqsZsS604lH6CTag8FPOuvPUaNiDFWV6lbQ7ve8Ta9xtQ6if3yNlARliHgWhM/Cy+BLTC4+1Eq2cD62ud7tFbxxcio60PVihGLsyiVSJn4X/W3QGksGSot70WQKBgQCDl9/huHJNN00aYcCaE9vxuOI89ecFvNJNmM804PrceULCjroaLoenGbwOqYqR2R6wXGe+k7tcX0p6d/NBmxMtWp6DX/y2nKWYZ+z+JY0UFuAj2DagR9B5IB5H7VjU/x7xQJGZZbSbhVGjLFIQUHV1i9Ud5KFMLzahlFsNtwVRQwKBgQCLuDvPq0QEd3uVVrccBcXFOYcHHuvCPXyclmX6HKg89im3CA4R8p5Svqz0Jc8BdHK0P4eplIj9qzWmB15GpnJsPdR/I1iYShTaaHWS8N/jIdDdChuOZdLr3YGQ/A24WHTRNez/d7/x1M5YjX+9X55QJz2QljR4hOt1cYOmt1AOwQKBgQCgb4HhAo/IRDifuXQc5SOgbM/woZ4/9Yxbdv3f9vBX9xRfcJ9deFsi513jgow6LF0+eS6rh189Ds/kXM1/wgC4dg+6rrW3x/gYXSXv6gaWTmYF0xtkS1TV/7JIu1CJmxA91aJEODEdjBQZWoFqZiQlTE1t2CuPsvTDq/HpedEJ5g==";
//文档测试key
//public static $key='MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJgHMGYsspghvP+yCbjLG43CkZuQ3YJyDcmEKxvmgblITfmiTPx2b9Y2iwDT9gnLGExTDm1BL2A8VzMobjaHfiCmTbDctu680MLmpDDkVXmJOqdlXh0tcLjhN4+iDA2KkRqiHxsDpiaKT6MMBuecXQbJtPlVc1XjVhoUlzUgPCrvAgMBAAECgYAV9saYTGbfsdLOF5kYo0dve1JxaO7dFMCcgkV+z2ujKtNmeHtU54DlhZXJiytQY5Dhc10cjb6xfFDrftuFcfKCaLiy6h5ETR8jyv5He6KH/+X6qkcGTkJBYG1XvyyFO3PxoszQAs0mrLCqq0UItlCDn0G72MR9/NuvdYabGHSzEQJBAMXB1/DUvBTHHH4LiKDiaREruBb3QtP72JQS1ATVXA2v6xJzGPMWMBGQDvRfPvuCPVmbHENX+lRxMLp39OvIn6kCQQDEzYpPcuHW/7h3TYHYc+T0O6z1VKQT2Mxv92Lj35g1XqV4Oi9xrTj2DtMeV1lMx6n/3icobkCQtuvTI+AcqfTXAkB6bCz9NwUUK8sUsJktV9xJN/JnrTxetOr3h8xfDaJGCuCQdFY+rj6lsLPBTnFUC+Vk4mQVwJIE0mmjFf22NWW5AkAmsVaRGkAmui41Xoq52MdZ8WWm8lY0BLrlBJlvveU6EPqtcZskWW9KiU2euIO5IcRdpvrB6zNMgHpLD9GfMRcPAkBUWOV/dH13v8V2Y/Fzuag/y5k3/oXi/WQnIxdYbltad2xjmofJ7DbB7MJqiZZD8jlr8PCZPwRNzc5ntDStc959';
public static $PayUrl = "https://vsp.allinpay.com/apiweb/unitorder/pay";//统一支付 正式
public static $PayCheckUrl = "https://vsp.allinpay.com/apiweb/tranx/query";//支付查询
public static $RefundUrl = "https://vsp.allinpay.com/apiweb/tranx/refund";//退款查询
public function PrivatedKey($key)
{
return "-----BEGIN PRIVATE KEY-----\n" .
chunk_split($key, 64) .
"-----END PRIVATE KEY-----";
}
public function StartPay($orderInfo)
{
// 要签名的数据(包含 sign 字段,但会被排除)
$data = [
'appid' => self::$appid,
'cusid' => self::$cusid,
'version'=>11,
'trxamt'=>$orderInfo['true_price'],//交易金额
'reqsn'=> $orderInfo['show'],//订单号
'paytype'=>'W06',//交易方式 W06小程序
'randomstr'=>bin2hex(random_bytes(32 / 2)),
'body'=>'微信小程序体检订单',//订单标题
'notify_url'=>env('APP_URL') . '/api/Pay/TongLian/callback',
//'sub_appid'=>env('WX_APP_ID'),
'acct'=>$orderInfo['openid'],//openid
'signtype' => 'RSA',
// 'sign' => '', // 可有可无,下面会排除
];
// 商户私钥(注意:需使用 PKCS#8 格式)
$privateKey=$this->PrivatedKey(self::$key);
$sign = $this->rsaSign($data, $privateKey, 'UTF-8');
$data['sign'] = $sign;
Log::info('支付请求参数', $data);
$response=Http::asForm()->post(self::$PayUrl,$data);
if ($response->successful()) {
$res = $response->json();
$check=self::ValidSign($res);
if($check===1){
$payInfo=json_decode($res['payinfo'],true);
$wc_chat_pay = new WeChatPay();
$wc_chat_pay->out_trade_no = $orderInfo['show'];
$wc_chat_pay->post_data = json_encode($data, JSON_UNESCAPED_UNICODE);
$wc_chat_pay->params = json_encode($payInfo, JSON_UNESCAPED_UNICODE);
$wc_chat_pay->save();
return $payInfo;
}else{
Yo::error_echo(999999, ['验证接口返回签名失败']);
}
}else{
Yo::error_echo(999999, ['请求失败']);
}
}
public function PayCheck($orderNumber)
{
$data = [
'appid' => self::$appid,
'cusid' => self::$cusid,
'version'=>11,
'reqsn'=> $orderNumber,//订单号
'randomstr'=>bin2hex(random_bytes(32 / 2)),
'signtype' => 'RSA',
// 'sign' => '', // 可有可无,下面会排除
];
$privateKey=$this->PrivatedKey(self::$key);
$sign = $this->rsaSign($data, $privateKey, 'UTF-8');
$data['sign'] = $sign;
$response=Http::asForm()->post(self::$PayCheckUrl,$data);
if ($response->successful()) {
$res = $response->json();
$check=self::ValidSign($res);
if($check===1){
return $res;
}else{
Yo::error_echo(999999, ['验证接口返回签名失败']);
}
}
else{
Yo::error_echo(999999, ['请求失败']);
}
}
public function CallBack($inBodyArray)
{
Log::info('通联支付回调参数:', $inBodyArray);
if(!empty($inBodyArray)){
$check=self::ValidSign($inBodyArray);
if($check===1){
return ['status'=>true,'body'=>$inBodyArray];
}else{
Log::info('通联支付回调参数,验签失败');
return ['status'=>false,'msg'=>'验签失败'];
}
}
}
public function Refund($orderInfo)
{
$data = [
'appid' => self::$appid,
'cusid' => self::$cusid,
'version'=>11,
'reqsn'=> $orderInfo['show'],//订单号
'randomstr'=>bin2hex(random_bytes(32 / 2)),
'trxamt'=>$orderInfo['true_price'],//交易金额
'oldtrxid'=>$orderInfo['transaction'],//原交易流水号
'signtype' => 'RSA',
// 'sign' => '', // 可有可无,下面会排除
];
$privateKey=$this->PrivatedKey(self::$key);
$sign = $this->rsaSign($data, $privateKey, 'UTF-8');
$data['sign'] = $sign;
$response=Http::asForm()->post(self::$RefundUrl,$data);
if ($response->successful()) {
$res = $response->json();
$check=self::ValidSign($res);
if($check===1){
return $res;
}else{
Yo::error_echo(999999, ['退款失败,验证接口返回签名失败']);
}
}else{
Yo::error_echo(999999, ['请求失败']);
}
}
/**
* RSA with SHA1 签名
*
* @param array $data 要签名的参数(自动排除空值和 sign 字段)
* @param string $privateKey RSA私钥PEM格式
* @param string $charset 字符编码
* @return string Base64编码的签名值
*/
private function rsaSign(array $data, string $privateKey, string $charset = 'UTF-8'): string
{
// 1. 过滤掉 sign 字段和空值字段
$filtered = array_filter($data, function ($value, $key) {
return $key !== 'sign' && $value !== null && $value !== '';
}, ARRAY_FILTER_USE_BOTH);
// 2. 按 key 的 ASCII 升序排序
ksort($filtered);
// 3. 拼接成 key=value&key=value 字符串
$stringToSign = http_build_query($filtered, '', '&', PHP_QUERY_RFC3986);
// 注意http_build_query 默认使用 UTF-8并且会 urlencode但有些场景要求不 urlencode
// 如果不需要 urlencode使用下面方式
// 手动拼接(不进行 urlencode
$pairs = [];
foreach ($filtered as $key => $value) {
$pairs[] = "$key=$value";
}
$stringToSign = implode('&', $pairs);
// 转为指定编码
$stringToSign = mb_convert_encoding($stringToSign, $charset, 'auto');
// 4. 使用 openssl_sign 进行 SHA1WithRSA 签名
$res = openssl_pkey_get_private($privateKey);
if (!$res) {
throw new \Exception('Invalid private key.');
}
openssl_sign($stringToSign, $signature, $res, OPENSSL_ALGO_SHA1);
openssl_free_key($res);
// 5. Base64 编码
return base64_encode($signature);
}
//验签
public static function ValidSign(array $array){
Log::info('验签:', $array);
$sign =$array['sign'];
unset($array['sign']);
ksort($array);
$bufSignSrc = self::ToUrlParams($array);
$public_key='MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB';
$public_key = chunk_split($public_key , 64, "\n");
$key = "-----BEGIN PUBLIC KEY-----\n$public_key-----END PUBLIC KEY-----\n";
$result= openssl_verify($bufSignSrc,base64_decode($sign), $key );
return $result;
}
public static function ToUrlParams(array $array)
{
$buff = "";
foreach ($array as $k => $v)
{
if($v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
}

@ -0,0 +1,108 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;
class TonglianTestController
{
public static $cusid = "56447508999A87S";//商户号 正式
public static $appid = "00352016";//appid 正式
//public static $key="MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCS6r706Ogi7FpYV71ccH1jwC2NZGcrWzt1Xw6rJ6+ZEeICQjUWZLPqc/D4fvh3xJPaxIqXlcA5y9xlPVO7hhoVqAKY3uPC519j6IFBxIUYC0fKWZdCpBK/kfcaqZu6ChH+hmawqfwqRjYeIGJLW2xyS8GAxQX6Uj32bZHW0xfl6Ia6lmVZ2pNpO8RS8ExhhuNc4Mm9G72+drQKfj809NNwO7fzNWa6htogszbhcf+n5pBqSzGn6j0RAnq6Eylza8GOt6LXI04KpvglPsvdCgJYK2VdezADG3XjBSdFo7ezyh0YRYVgzEWpAA1bFe6eOJPsMccetxVr/s1PwDXg3kMnAgMBAAECggEARUHpRA3ZhMETs+qkp0OWMKRjNPC8W+l1pZZqlU+vjUKrXvI0EXrmf6MpWRON8PPX2XzmcqATDovmOUmIQ/HrMQNTOhp0lyg4RSJRcJ4COfvzW1YRosYy2mEmcki7Ux+1LN3R4f04FPulPl14yNpvzI+eyCPY9hC4CgfMBM/dR7E3nU/kpesGhfwPs/prXHs9Dy/r6YG7RjSF/QANga8rVFMnQJpxSYBABRVRePtTThTZ8fTgabLpqXOihqhoBSYpt0sP5FK7cMOKJn93H4Y2UbSzcLZRdbm1vjuVILxyHe1XQ72gFbHucy1XbjQ+GKMLaHkXx9ikqjaeg5lQIWpWCQKBgQDCCLGu9p4cy8paRTykf7El0SaPYcsW8JrJqfd5USV/gKNGJ9N+mGxEo+RszD61L5Vufniupzbfepl1kCVJGQ2lqgfJe1r3RToF8PPIvq/IdBfcVpIOeIf6y/JK0OJwBnk4WwTprWIicUDW5Ju+vvddxOL2xAr+f+pZJG79PdYDfwKBgQDB1f0CE3ExhzfznQyLO7T418qXrmzSkp0qi7KS+zNWvamgHNBovqsZsS604lH6CTag8FPOuvPUaNiDFWV6lbQ7ve8Ta9xtQ6if3yNlARliHgWhM/Cy+BLTC4+1Eq2cD62ud7tFbxxcio60PVihGLsyiVSJn4X/W3QGksGSot70WQKBgQCDl9/huHJNN00aYcCaE9vxuOI89ecFvNJNmM804PrceULCjroaLoenGbwOqYqR2R6wXGe+k7tcX0p6d/NBmxMtWp6DX/y2nKWYZ+z+JY0UFuAj2DagR9B5IB5H7VjU/x7xQJGZZbSbhVGjLFIQUHV1i9Ud5KFMLzahlFsNtwVRQwKBgQCLuDvPq0QEd3uVVrccBcXFOYcHHuvCPXyclmX6HKg89im3CA4R8p5Svqz0Jc8BdHK0P4eplIj9qzWmB15GpnJsPdR/I1iYShTaaHWS8N/jIdDdChuOZdLr3YGQ/A24WHTRNez/d7/x1M5YjX+9X55QJz2QljR4hOt1cYOmt1AOwQKBgQCgb4HhAo/IRDifuXQc5SOgbM/woZ4/9Yxbdv3f9vBX9xRfcJ9deFsi513jgow6LF0+eS6rh189Ds/kXM1/wgC4dg+6rrW3x/gYXSXv6gaWTmYF0xtkS1TV/7JIu1CJmxA91aJEODEdjBQZWoFqZiQlTE1t2CuPsvTDq/HpedEJ5g==";
//public static $key='MIIEowIBAAKCAQEAnlGKzchX0aOn9xRVuRgQRp7Oc0a5ArogQA1tOcf7sSq+M2+2bTmCxQChBrwJAo7d68jiZKRzYLTfy40gEXwc+wLDPubnyPrLnoVDubVxNXOLdF6lpm28wOO5xn1Daqd+E9l+wjhcbcUvVOSU12SXcfmwCh4lsdbTyeOFB8qlqzPvT4lGSjD+nZyiAwBgoYD13Pb2ipdAhOLfwyicv5+iWTnjNY3ZQ+5C5iajXyqXheE8/u5Gc0f+xUJx4ibYtEGx3DY/Ix7+9U2p/a9DV0KMP2xb+WPdYctqtQzX1Su3VrCGGfVCHnZGwDEvQ5eBM66/2UljDCB08TO1snu16TULPQIDAQABAoIBADzVuo+Of2hYCa/gyXvhakeouE4FjAwnN0NFpYYBeY6/jOy47ZGU+tH2hunOkWvBODdlLtFbe9ZaSnCuHvd5CK3PhvUBx2ksLdgQ/1A6D3Fpn9mskNyd6Fz6ZKWH9sLh74lzFslM3P91ONXXK/aEeclbF7EbmoJ2uVUnrzOqQ/S/2lhkgycoaCj1OC8fID5dQzmZcBVx+d++B2N96as2vqCuOW2pBTAciDIVTJNomzcahvu3fiVSswJ5j08LX8ZxT5v3soET3eo40pZMzC8H03y6LDEKsig1588YcEnGizgH8622lLnrOW3IAedSCr1bwOMQ98hWvc5r2vrZ4xoPBkUCgYEAz3nJyjUhq3KgCeDNnuhTdqZ+fL1ZrOk9T7+OM3mW/WHThQXQ4ayFwOU9F30CZLImphskUk+ebZnIl8M+/8+klzhjRgty5lfzTjbZCREKoegcqczeKLLzpAzi9K8FHlpJYHkT9+E5QsLc1BFpJwAUbwjx6Hwqxz9BUcSCovDVyTMCgYEAw1iPao9loz0RQmyOb7ufWw4gdyEdvrFPgnAOh/ZSOXs382NS7nOEMh26CTKV1pZkb2d4FNgIL1rSThVnb/c3QSeOjcbSUZ9T58FvW20Pn7hTMZuIGlRjit+AqCfr2cklcyJgd5poDZstI/5Y56bTIO+NMfyyFgXbZuFuEgFJOc8CgYALWW0pa4ig+U852xtEYw8VwXvP1QfPxp58+0yLEk6pI63PbAcGIUrbx251F3iHC5vDoF53RjWzZyMq8hpDIhet0f7UORIa+Zqsn6F1toHvY2QWAcfxUAC166KKofxUsbmr1lO6To60UTaFP0KSSJXVkRaykgBBD/vBvk8rHKOFMwKBgQCxSfPHW2N8FlVOuqU/BMIo6pZOaDDNu7CUiky12rlfT9REwXUn0pE8xrvr0wwoWA/JB9f02uf6ymup0EUzWeO870Cyrap9x6Nn56fACygt5iUjFawdcU9yX0wt0SV9X8/sQVvZ0Ln090utqg5YF5DwCFlV76hU0nYAVkIGd0JVAwKBgCOkJvO1jlE3e2f3KqdtiL9rl2JoUohdSPXrDONn6NwyBOS57bSj0U/4wu1x1zZnKcJZzol+5prnSg/ijfGlvJ3sTw1XGI9m3pYlh/5/Jk/cVox5MjQZwLt0UDoUob8Ft0LtWTNn36UsvwVeDaU3HF+y5zitBYdzbgZ53XFXTREt';
public static $PayUrl = "https://vsp.allinpay.com/apiweb/unitorder/pay";//统一支付 正式
public function StartPay()
{
// 要签名的数据(包含 sign 字段,但会被排除)
$data = [
'appid' => self::$appid,
'cusid' => self::$cusid,
'version'=>11,
'trxamt'=>'1',//交易金额
'reqsn'=>'fdsfsdf' . date('YmdHis') . rand(1000, 9999),//订单号
'paytype'=>'W06',//交易方式 W06小程序
'randomstr'=>bin2hex(random_bytes(32 / 2)),
'body'=>'微信小程序体检订单',//订单标题
'notify_url'=>'https://ezeys-tj.sixinyun.com',
'sub_appid'=>env('WX_APP_ID'),
'acct'=>'oV-6x7bN8zp2UNM3z1xbvz-EsIKQ',//openid
'signtype' => 'RSA',
// 'sign' => '', // 可有可无,下面会排除
];
// 商户私钥(注意:需使用 PKCS#8 格式)
// $privateKey=$this->PrivatedKey(self::$key);
$sign = $this->Sign($data);
$data['sign'] = $sign;
return self::ValidSign($data);
$response=Http::Post(self::$PayUrl,$data);
if ($response->successful()) {
$res = $response->json();
var_dump($res);
}else{
Yo::error_echo(999999, ['请求失败']);
}
return response()->json([
'data' => $data,
]);
}
public static function Sign(array $array){
ksort($array);
$bufSignSrc = self::ToUrlParams($array);
$key="MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCS6r706Ogi7FpYV71ccH1jwC2NZGcrWzt1Xw6rJ6+ZEeICQjUWZLPqc/D4fvh3xJPaxIqXlcA5y9xlPVO7hhoVqAKY3uPC519j6IFBxIUYC0fKWZdCpBK/kfcaqZu6ChH+hmawqfwqRjYeIGJLW2xyS8GAxQX6Uj32bZHW0xfl6Ia6lmVZ2pNpO8RS8ExhhuNc4Mm9G72+drQKfj809NNwO7fzNWa6htogszbhcf+n5pBqSzGn6j0RAnq6Eylza8GOt6LXI04KpvglPsvdCgJYK2VdezADG3XjBSdFo7ezyh0YRYVgzEWpAA1bFe6eOJPsMccetxVr/s1PwDXg3kMnAgMBAAECggEARUHpRA3ZhMETs+qkp0OWMKRjNPC8W+l1pZZqlU+vjUKrXvI0EXrmf6MpWRON8PPX2XzmcqATDovmOUmIQ/HrMQNTOhp0lyg4RSJRcJ4COfvzW1YRosYy2mEmcki7Ux+1LN3R4f04FPulPl14yNpvzI+eyCPY9hC4CgfMBM/dR7E3nU/kpesGhfwPs/prXHs9Dy/r6YG7RjSF/QANga8rVFMnQJpxSYBABRVRePtTThTZ8fTgabLpqXOihqhoBSYpt0sP5FK7cMOKJn93H4Y2UbSzcLZRdbm1vjuVILxyHe1XQ72gFbHucy1XbjQ+GKMLaHkXx9ikqjaeg5lQIWpWCQKBgQDCCLGu9p4cy8paRTykf7El0SaPYcsW8JrJqfd5USV/gKNGJ9N+mGxEo+RszD61L5Vufniupzbfepl1kCVJGQ2lqgfJe1r3RToF8PPIvq/IdBfcVpIOeIf6y/JK0OJwBnk4WwTprWIicUDW5Ju+vvddxOL2xAr+f+pZJG79PdYDfwKBgQDB1f0CE3ExhzfznQyLO7T418qXrmzSkp0qi7KS+zNWvamgHNBovqsZsS604lH6CTag8FPOuvPUaNiDFWV6lbQ7ve8Ta9xtQ6if3yNlARliHgWhM/Cy+BLTC4+1Eq2cD62ud7tFbxxcio60PVihGLsyiVSJn4X/W3QGksGSot70WQKBgQCDl9/huHJNN00aYcCaE9vxuOI89ecFvNJNmM804PrceULCjroaLoenGbwOqYqR2R6wXGe+k7tcX0p6d/NBmxMtWp6DX/y2nKWYZ+z+JY0UFuAj2DagR9B5IB5H7VjU/x7xQJGZZbSbhVGjLFIQUHV1i9Ud5KFMLzahlFsNtwVRQwKBgQCLuDvPq0QEd3uVVrccBcXFOYcHHuvCPXyclmX6HKg89im3CA4R8p5Svqz0Jc8BdHK0P4eplIj9qzWmB15GpnJsPdR/I1iYShTaaHWS8N/jIdDdChuOZdLr3YGQ/A24WHTRNez/d7/x1M5YjX+9X55QJz2QljR4hOt1cYOmt1AOwQKBgQCgb4HhAo/IRDifuXQc5SOgbM/woZ4/9Yxbdv3f9vBX9xRfcJ9deFsi513jgow6LF0+eS6rh189Ds/kXM1/wgC4dg+6rrW3x/gYXSXv6gaWTmYF0xtkS1TV/7JIu1CJmxA91aJEODEdjBQZWoFqZiQlTE1t2CuPsvTDq/HpedEJ5g==";
$private_key = chunk_split($key , 64);
$key = "-----BEGIN RSA PRIVATE KEY-----\n".$private_key."-----END RSA PRIVATE KEY-----";
// echo $key;
if(openssl_sign($bufSignSrc, $signature, $key )){
// echo 'sign success';
}else{
echo 'sign fail';
}
$sign = base64_encode($signature);//加密后的内容通常含有特殊字符需要编码转换下在网络间通过url传输时要注意base64编码是否是url安全的
//echo $sign;
// echo $signature,"\n";
return $sign;
}
public static function ToUrlParams(array $array)
{
$buff = "";
foreach ($array as $k => $v)
{
if($v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
/**
* 校验签名
* @param array 参数
* @param unknown_type appkey
*/
public static function ValidSign(array $array){
$sign =$array['sign'];
unset($array['sign']);
ksort($array);
$bufSignSrc = self::ToUrlParams($array);
$public_key='MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB';
$public_key = chunk_split($public_key , 64, "\n");
$key = "-----BEGIN PUBLIC KEY-----\n".$public_key."-----END PUBLIC KEY-----\n";
$result= openssl_verify($bufSignSrc,base64_decode($sign), $key );
return $result;
}
}

@ -15,6 +15,7 @@ use App\Models\WeChatPay;
use App\Models\WeChatRefund;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Yo;
use Login;
use Lu;
@ -460,8 +461,48 @@ class UserOrderController extends Controller
->orderBy('id', 'desc')->get();
return Yo::echo(['list' => $list]);
}
public function mp_info(Request $request)
{
Login::user();
$id = $request->post('id');
$order_info = UserOrder::where('id', $id)
->where('user', Login::$info->id)
->orderBy('id', 'desc')->first();
if (!$order_info) Yo::error_echo(100000, ['订单']);
if ($order_info->status == 1 && $order_info->pay_type == 1) {
$TongLianPay = new TongLianPayController(); //通联支付
$check = $TongLianPay->PayCheck($order_info->show);
$we_chat_pay = WeChatPay::where('out_trade_no', $order_info->show)->first();
if (!!$we_chat_pay) {
$we_chat_pay->callback = json_encode([
'type' => 'auto',
'input' => '',
'headers' => '',
'res' => $check,
], JSON_UNESCAPED_UNICODE);
$we_chat_pay->save();
}
if($check['retcode']==='SUCCESS'){
if($check['trxstatus']=='0000'){
$ret = self::done($order_info->id, $check['trxid']);
if ($ret == 'status') {
$order_info = UserOrder::where('id', $id)
->where('user', Login::$info->id)
->orderBy('id', 'desc')->first();
}
}else{
Yo::error_echo(999999, ['支付失败,'.$check['errmsg']]);
}
}else{
Yo::error_echo(999999, ['支付失败,'.$check['retmsg']]);
}
}
return Yo::echo(['info' => $order_info]);
}
public function mp_info_WeiXin(Request $request)
{
Login::user();
$id = $request->post('id');
@ -541,7 +582,37 @@ class UserOrderController extends Controller
if (count($res['data']) < 1) Yo::error_echo(200052);
if ($res['data'][0]['当前状态'] !== '未登记') Yo::error_echo(200052);
switch ($order_info->pay_type) {
case 1:
case 1://通联支付
$hospital_extra_content = self::pay_config($order_info->hospital);
$TongLianPay= new TongLianPayController();
$refund_date=[
'show' => $order_info->show,
'true_price' => $order_info->true_price * 100,
'transaction' => $order_info->transaction,
];
$tl_res = $TongLianPay->Refund($refund_date);
$out_trade_no = $order_info->show;
$wcr = new WeChatRefund();
$post_data = [
'transaction_id' => $order_info->transaction,
'out_refund_no' => $out_trade_no,
'total' =>(int) bcmul($order_info->true_price, '100', 0)
];
$wcr->out_trade_no = $out_trade_no;
$wcr->post_data = json_encode($post_data, JSON_UNESCAPED_UNICODE);
$wcr->params = json_encode($tl_res, JSON_UNESCAPED_UNICODE);
$wcr->save();
$err_msg= empty($tl_res['retmsg'])?' ':$tl_res['retmsg'];
if($tl_res['retcode']!=='SUCCESS') Yo::error_echo(999999, ['退款失败,'.$tl_res['retmsg']]);
if($tl_res['trxstatus']!=='0000') Yo::error_echo(999999, ['退款失败,'.$err_msg]);
$order_info->status = 5;
$order_info->refund = $wcr->id;
$order_info->refund_time = date('Y-m-d H:i:s');
$order_info->save();
break;
case 111111111://微信支付,暂时停用
$hospital_extra_content = self::pay_config($order_info->hospital);
$wcp = new WeChatPayController();
$wcp->builder([
@ -828,7 +899,45 @@ class UserOrderController extends Controller
return Yo::echo($list);
}
public function callback($id)
public function callback()//通联支付回调
{
$params = array();
foreach($_POST as $key=>$val) {//动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容由于收银宝加字段而引起的签名异常
$params[$key] = $val;
}
if(count($params)<1){//,
echo "error";
exit();
}
$TongLianPay=new TongLianPayController();
$res=$TongLianPay->CallBack($params);
if($res['status']){
$order_info = UserOrder::where('show', $res['body']['cusorderid'])->first();
if (!!$order_info and $order_info->status ==1) {
$we_chat_pay = WeChatPay::where('out_trade_no', $res['body']['cusorderid'])->first();
if (!!$we_chat_pay) {
$we_chat_pay->callback = json_encode([
'type' => 'callback',
'input' => $params,
'headers' => [],
'res' => $res,
], JSON_UNESCAPED_UNICODE);
$we_chat_pay->save();
}
if($res['body']['trxstatus']=='0000'){
self::done($order_info->id, $res['body']['trxid']);
}
echo "success";
}
if (!!$order_info and $order_info->status ==2) {
echo "success";
}
}else{
echo "error";
}
}
public function callback_WeiXin($id)
{
$input = file_get_contents('php://input');
$headers = request()->header();
@ -906,8 +1015,36 @@ class UserOrderController extends Controller
$hospital_extra_content = self::pay_config($order_info->hospital, false);
$hospital_sharing_content = self::sharing_config($order_info->hospital, false);
if ($pay_type == 1 && $hospital_extra_content['wxp']['open'] == 2) $pay_type = 3;
$user_account_info = UserAccount::where('user', Login::$info->id)->first();
switch ($pay_type) {
case 1:
$we_chat_pay = WeChatPay::where('out_trade_no', $order_info->show)->first();
if (!!$we_chat_pay) {
$pay = json_decode($we_chat_pay->params, true);
}else{
$TongLianPay=new TongLianPayController();
$data=[
'true_price' =>(int) bcmul($order_info->true_price, '100', 0),
'show' => $order_info->show,//订单号
'openid' => $user_account_info->account,
];
$pay=$TongLianPay->StartPay($data);
$order_info->pay_type = 1;
$order_info->save();
}
$pay2 = [
'appid' => $pay['appId'],
'timestamp' => $pay['timeStamp'],
'nonce_str' => $pay['nonceStr'],
'package' => $pay['package'],
'pay_sign' => $pay['paySign'],
'sign_type' => $pay['signType'],
];
return Yo::echo([
'action' => 'wxp',
'pay' => $pay2
]);
case 1111111111://暂时不用了,对接第三方了
$we_chat_pay = WeChatPay::where('out_trade_no', $order_info->show)->first();
if (!!$we_chat_pay) {
$params = json_decode($we_chat_pay->params, true);
@ -930,7 +1067,7 @@ class UserOrderController extends Controller
'v3' => $hospital_extra_content['wxp']['v3'],
]);
$out_trade_no = $order_info->show;
$user_account_info = UserAccount::where('user', Login::$info->id)->first();
$pay = $wcp->create([
'description' => '体检预约',
'out_trade_no' => $out_trade_no,

@ -139,6 +139,18 @@ class Lu
$str_len = strlen($data_str);
$str_size = $str_len / 1024;
if ($str_size > 40) $data_str = '{"data":"Row size too large"}';
if (!self::$request) {
// 如果还没有初始化,手动初始化一次
self::CheckTableName(); // 确保表存在并创建 request 实例
// 为所有必填字段设置值
self::$request->request_ip = self::ip();
self::$request->post_data = '{}';
self::$request->get_data = json_encode($_GET, JSON_UNESCAPED_UNICODE) ?: '{}';
self::$request->header_data = json_encode(request()->header(), JSON_UNESCAPED_UNICODE) ?: '{}';
self::$request->request_url = explode('?', $_SERVER['REQUEST_URI'])[0] ?? '';
}
self::$request->response_data = $data_str;
self::$request->save();
}

@ -138,4 +138,6 @@ return [
200088 => '分账名称长度在1-50位字符之间',
200089 => '分账类型不支持追回',
200090 => '该报告未出',
999999=>'?',
];

@ -21,6 +21,7 @@ Route::get('/', function () {
Route::any('api/yo', \App\Http\Controllers\YoController::class);
Route::post("api/In/Order/update", [\App\Http\Controllers\UserOrderController::class, 'check_order']);
Route::post("api/Pay/Wxp/callback/{id}", [\App\Http\Controllers\UserOrderController::class, 'callback']);
Route::any("api/Pay/TongLian/callback", [\App\Http\Controllers\UserOrderController::class, 'callback']);
Route::post("api/Test/UserOrder/done_test", [\App\Http\Controllers\UserOrderController::class, 'done_test']);
Route::post("api/$admin_api/NoProfitsharing/create", [\App\Http\Controllers\NoProfitsharingController::class, 'create']);
@ -182,3 +183,5 @@ Route::post("api/$mp_api/Chat/UserChangeWorkOrder", [\App\Http\Controllers\ChatC
Route::post("api/$admin_api/Get/SiXinItems", [\App\Http\Controllers\ComboItemController::class, 'GetSiXinItems']);
Route::post("api/$admin_api/Get/SiXinItemsLinks", [\App\Http\Controllers\ComboItemController::class, 'GetSiXinItemsLinks']);
Route::post("api/$admin_api/Bind/SiXinItemsLinks", [\App\Http\Controllers\ComboItemController::class, 'BindSiXinItemsLinks']);
Route::post("api/$mp_api/TongLianPay/StartPay", [\App\Http\Controllers\TongLianPayController::class, 'StartPay']);
Route::post("api/$mp_api/TongLianPay/StartPayTest", [\App\Http\Controllers\TonglianTestController::class, 'StartPay']);

@ -1,9 +1,9 @@
let url_ = "https://zwrmyy.sixinyun.com";
let report_url_ = "https://zwrmyy.sixinyun.com";
let h5_url_ = "https://zwrmyy.sixinyun.com";
let url_ = "https://hezeys-tj.sixinyun.com";
let report_url_ = "https://hezeys-tj.sixinyun.com";
let h5_url_ = "https://hezeys-tj.sixinyun.com";
const dev = 0;
if (dev === 1) {
url_ = "http://sixintijian";
url_ = "http://hezeshengyilocal";
report_url_ = "http://192.168.31.106:5173";
h5_url_ = "http://192.168.31.106:5173";
}

@ -2,11 +2,11 @@ import {
$post
} from '@/lu/axios.js'
import $api from './api.js'
let url_ = "https://zwrmyy.sixinyun.com";
let chat_url = "https://zwrmyy.sixinyun.com"
let url_ = "https://hezeys-tj.sixinyun.com";
let chat_url = "https://hezeys-tj.sixinyun.com"
const dev =0
if (dev === 1) {
url_ = "http://sixintijian"
url_ = "http://hezeshengyilocal"
chat_url = "http://192.168.31.106:5173"
}
export const ReportUrl = (data) => {

@ -49,7 +49,7 @@
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wx2114ce1ee657d087",
"appid" : "wx4bd2065274ee4967",
"setting" : {
"urlCheck" : false
},

@ -62,6 +62,7 @@
pay_type: 1
})
$response(response, () => {
console.log(response);
wx.requestPayment({
timeStamp: response.data.pay.timestamp,
nonceStr: response.data.pay.nonce_str,
@ -75,6 +76,7 @@
url: `/pages/buy/done/done?id=${order}`
})
} else {
console.log(res.errMsg);
uni.reLaunch({
url: '/pages/main/order/order'
})

@ -95,6 +95,7 @@
url: `/pages/buy/done/done?id=${order}`
})
} else {
console.log(res.errMsg);
OrderList()
}
}

Loading…
Cancel
Save