|
@@ -1,187 +1,193 @@
|
|
<?php
|
|
<?php
|
|
|
|
+
|
|
declare(strict_types=1);
|
|
declare(strict_types=1);
|
|
|
|
+
|
|
namespace App\libs\wechat\pay;
|
|
namespace App\libs\wechat\pay;
|
|
|
|
|
|
-//use EasyWeChat\MiniProgram\Application;
|
|
|
|
-//use EasyWeChat\MiniApp\Application;
|
|
|
|
-//use EasyWeChat\Pay\Application as PayApplication;
|
|
|
|
|
|
+// use EasyWeChat\MiniProgram\Application;
|
|
|
|
+// use EasyWeChat\MiniApp\Application;
|
|
|
|
+// use EasyWeChat\Pay\Application as PayApplication;
|
|
use EasyWeChat\Payment\Application;
|
|
use EasyWeChat\Payment\Application;
|
|
use EasyWeChat\Kernel\Support\Str;
|
|
use EasyWeChat\Kernel\Support\Str;
|
|
-//use EasyWeChat\Payment\LegacySignature;
|
|
|
|
-//use GuzzleHttp\Client;
|
|
|
|
-//use Hyperf\HttpServer\Contract\RequestInterface;
|
|
|
|
-//use Hyperf\Utils\ApplicationContext;
|
|
|
|
|
|
+// use EasyWeChat\Payment\LegacySignature;
|
|
|
|
+// use GuzzleHttp\Client;
|
|
|
|
+// use Hyperf\HttpServer\Contract\RequestInterface;
|
|
|
|
+// use Hyperf\Utils\ApplicationContext;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Request;
|
|
use EasyWeChat\Factory;
|
|
use EasyWeChat\Factory;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
class Wechat
|
|
class Wechat
|
|
{
|
|
{
|
|
|
|
+ // public static function app() {
|
|
|
|
+ // $config = [
|
|
|
|
+ // 'app_id' => 'wx93e902f62d243388',
|
|
|
|
+ // 'secret' => '80d6e14f55d0593a53d131e93215ea20',
|
|
|
|
+ // // 'oauth' => [
|
|
|
|
+ // // 'scopes' => ['snsapi_userinfo'],
|
|
|
|
+ // // 'callback' => '/oauth/callback',
|
|
|
|
+ // // ],
|
|
|
|
+ //
|
|
|
|
+ // // 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
|
|
|
|
+ // 'response_type' => 'array',
|
|
|
|
+ //
|
|
|
|
+ // //...
|
|
|
|
+ // ];
|
|
|
|
+ //
|
|
|
|
+ // return new Application($config);
|
|
|
|
+ // }
|
|
|
|
|
|
-// public static function app() {
|
|
|
|
-// $config = [
|
|
|
|
-// 'app_id' => 'wx93e902f62d243388',
|
|
|
|
-// 'secret' => '80d6e14f55d0593a53d131e93215ea20',
|
|
|
|
-// // 'oauth' => [
|
|
|
|
-// // 'scopes' => ['snsapi_userinfo'],
|
|
|
|
-// // 'callback' => '/oauth/callback',
|
|
|
|
-// // ],
|
|
|
|
-//
|
|
|
|
-// // 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
|
|
|
|
-// 'response_type' => 'array',
|
|
|
|
-//
|
|
|
|
-// //...
|
|
|
|
-// ];
|
|
|
|
-//
|
|
|
|
-// return new Application($config);
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
- public static function pay() {
|
|
|
|
- $arr = config('swdz.wechatPay');
|
|
|
|
|
|
+ public static function pay()
|
|
|
|
+ {
|
|
|
|
+ $arr = config('swdz.wechatPay');
|
|
$config = [
|
|
$config = [
|
|
// 必要配置
|
|
// 必要配置
|
|
- 'app_id' => $arr['appid'],
|
|
|
|
- 'mch_id' => $arr['mch_id'],
|
|
|
|
- 'key' => $arr['key'], // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
|
|
|
|
|
|
+ 'app_id' => $arr['appid'],
|
|
|
|
+ 'mch_id' => $arr['mch_id'],
|
|
|
|
+ 'key' => $arr['key'], // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
|
|
|
|
|
|
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
|
|
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
|
|
- 'cert_path' => __DIR__ . '/ssl/apiclient_cert.pem', // XXX: 绝对路径!!!!
|
|
|
|
- 'key_path' => __DIR__ . '/ssl/apiclient_key.pem', // XXX: 绝对路径!!!!
|
|
|
|
|
|
+ 'cert_path' => __DIR__ . '/ssl/apiclient_cert.pem', // XXX: 绝对路径!!!!
|
|
|
|
+ 'key_path' => __DIR__ . '/ssl/apiclient_key.pem', // XXX: 绝对路径!!!!
|
|
|
|
|
|
- 'notify_url' => 'https://t18.9026.com/api/wechat/pay/aiCallback', // 你也可以在下单时单独设置来想覆盖它
|
|
|
|
|
|
+ 'notify_url' => 'https://t18.9026.com/api/wechat/pay/aiCallback', // 你也可以在下单时单独设置来想覆盖它
|
|
];
|
|
];
|
|
|
|
|
|
$app = Factory::payment($config);
|
|
$app = Factory::payment($config);
|
|
-// $config = [
|
|
|
|
-// 'mch_id' => 1536361101,
|
|
|
|
-// 'app_id' => 'wx93e902f62d243388',
|
|
|
|
-// // 商户证书
|
|
|
|
-// 'private_key' => __DIR__ . '/ssl/apiclient_key.pem',
|
|
|
|
-// 'certificate' => __DIR__ . '/ssl/apiclient_cert.pem',
|
|
|
|
-//
|
|
|
|
-// // v3 API 秘钥
|
|
|
|
-// 'secret_key' => '43A03299A3C3FED3D8CE7B820Fxxxxx',
|
|
|
|
-//
|
|
|
|
-// // v2 API 秘钥
|
|
|
|
-// 'v2_secret_key' => 'pfbrMsAU5v9OFvJdqrg1c8YSIdtdPl8Z',
|
|
|
|
-//
|
|
|
|
-// // 平台证书:微信支付 APIv3 平台证书,需要使用工具下载
|
|
|
|
-// // 下载工具:https://github.com/wechatpay-apiv3/CertificateDownloader
|
|
|
|
-// 'platform_certs' => [
|
|
|
|
-// // 请使用绝对路径
|
|
|
|
-// // '/path/to/wechatpay/cert.pem',
|
|
|
|
-// ],
|
|
|
|
-//
|
|
|
|
-// /**
|
|
|
|
-// * 接口请求相关配置,超时时间等,具体可用参数请参考:
|
|
|
|
-// * https://github.com/symfony/symfony/blob/5.3/src/Symfony/Contracts/HttpClient/HttpClientInterface.php
|
|
|
|
-// */
|
|
|
|
-// 'http' => [
|
|
|
|
-// 'throw' => true, // 状态码非 200、300 时是否抛出异常,默认为开启
|
|
|
|
-// 'timeout' => 5.0,
|
|
|
|
-// // 'base_uri' => 'https://api.mch.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri
|
|
|
|
-// ]
|
|
|
|
-// ];
|
|
|
|
-// var_dump(__DIR__ . '/ssl/apiclient_key.pem');
|
|
|
|
-// $app = new Application($config);
|
|
|
|
- return $app;
|
|
|
|
- }
|
|
|
|
- public static function addOrder($order, $user){
|
|
|
|
|
|
+
|
|
|
|
+ // $config = [
|
|
|
|
+ // 'mch_id' => 1536361101,
|
|
|
|
+ // 'app_id' => 'wx93e902f62d243388',
|
|
|
|
+ // // 商户证书
|
|
|
|
+ // 'private_key' => __DIR__ . '/ssl/apiclient_key.pem',
|
|
|
|
+ // 'certificate' => __DIR__ . '/ssl/apiclient_cert.pem',
|
|
|
|
+ //
|
|
|
|
+ // // v3 API 秘钥
|
|
|
|
+ // 'secret_key' => '43A03299A3C3FED3D8CE7B820Fxxxxx',
|
|
|
|
+ //
|
|
|
|
+ // // v2 API 秘钥
|
|
|
|
+ // 'v2_secret_key' => 'pfbrMsAU5v9OFvJdqrg1c8YSIdtdPl8Z',
|
|
|
|
+ //
|
|
|
|
+ // // 平台证书:微信支付 APIv3 平台证书,需要使用工具下载
|
|
|
|
+ // // 下载工具:https://github.com/wechatpay-apiv3/CertificateDownloader
|
|
|
|
+ // 'platform_certs' => [
|
|
|
|
+ // // 请使用绝对路径
|
|
|
|
+ // // '/path/to/wechatpay/cert.pem',
|
|
|
|
+ // ],
|
|
|
|
+ //
|
|
|
|
+ // /**
|
|
|
|
+ // * 接口请求相关配置,超时时间等,具体可用参数请参考:
|
|
|
|
+ // * https://github.com/symfony/symfony/blob/5.3/src/Symfony/Contracts/HttpClient/HttpClientInterface.php
|
|
|
|
+ // */
|
|
|
|
+ // 'http' => [
|
|
|
|
+ // 'throw' => true, // 状态码非 200、300 时是否抛出异常,默认为开启
|
|
|
|
+ // 'timeout' => 5.0,
|
|
|
|
+ // // 'base_uri' => 'https://api.mch.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri
|
|
|
|
+ // ]
|
|
|
|
+ // ];
|
|
|
|
+ // var_dump(__DIR__ . '/ssl/apiclient_key.pem');
|
|
|
|
+ // $app = new Application($config);
|
|
|
|
+ return $app;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static function addOrder($order, $user)
|
|
|
|
+ {
|
|
$result = self::pay()->order->unify([
|
|
$result = self::pay()->order->unify([
|
|
- 'body' => '小程序购买钻石次数',
|
|
|
|
- 'device_info' => $user->id,
|
|
|
|
- "nonce_str" => Str::random(),
|
|
|
|
- 'out_trade_no' => $order->order,
|
|
|
|
- 'total_fee' => $order->amount * 10000,
|
|
|
|
|
|
+ 'body' => '小程序购买钻石次数',
|
|
|
|
+ 'device_info' => $user->id,
|
|
|
|
+ 'nonce_str' => Str::random(),
|
|
|
|
+ 'out_trade_no' => $order->order,
|
|
|
|
+ 'total_fee' => $order->amount * 10000,
|
|
'spbill_create_ip' => '47.93.12.114', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
|
|
'spbill_create_ip' => '47.93.12.114', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
|
|
- 'notify_url' => 'https://t18.9026.com/api/wechat/pay/aiCallback', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
|
|
|
- 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
|
|
|
|
- 'openid' => $user->open_id,
|
|
|
|
|
|
+ 'notify_url' => 'https://t18.9026.com/api/wechat/pay/aiCallback', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
|
|
|
+ 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
|
|
|
|
+ 'openid' => $user->open_id,
|
|
]);
|
|
]);
|
|
-// $params = [
|
|
|
|
-// "appid" => $config['app_id'],
|
|
|
|
-// "mch_id" => $config['mch_id'],
|
|
|
|
-// "device_info" => $user->id,
|
|
|
|
-// "nonce_str" => Str::random(),
|
|
|
|
-// "openid" => $user->open_id,
|
|
|
|
-// "body" => "小程序购买钻石次数",
|
|
|
|
-// "out_trade_no"=> $order->order,
|
|
|
|
-// "total_fee"=> $order->amount,
|
|
|
|
-// "spbill_create_ip" => "47.93.12.114",
|
|
|
|
-// // "time_start"=> $order->created_at->format('YmdHis'),
|
|
|
|
-// // "time_expire"=> $order->created_at->addMinutes(30)->format('YmdHis'),
|
|
|
|
-// "notify_url"=> 'https://t18.9026.com/api/wechat/pay/aiCallback',
|
|
|
|
-// "trade_type"=> 'JSAPI',
|
|
|
|
-// "detail"=> json_encode(['goods_detail'=> []])
|
|
|
|
-// ];
|
|
|
|
|
|
+
|
|
|
|
+ // $params = [
|
|
|
|
+ // "appid" => $config['app_id'],
|
|
|
|
+ // "mch_id" => $config['mch_id'],
|
|
|
|
+ // "device_info" => $user->id,
|
|
|
|
+ // "nonce_str" => Str::random(),
|
|
|
|
+ // "openid" => $user->open_id,
|
|
|
|
+ // "body" => "小程序购买钻石次数",
|
|
|
|
+ // "out_trade_no"=> $order->order,
|
|
|
|
+ // "total_fee"=> $order->amount,
|
|
|
|
+ // "spbill_create_ip" => "47.93.12.114",
|
|
|
|
+ // // "time_start"=> $order->created_at->format('YmdHis'),
|
|
|
|
+ // // "time_expire"=> $order->created_at->addMinutes(30)->format('YmdHis'),
|
|
|
|
+ // "notify_url"=> 'https://t18.9026.com/api/wechat/pay/aiCallback',
|
|
|
|
+ // "trade_type"=> 'JSAPI',
|
|
|
|
+ // "detail"=> json_encode(['goods_detail'=> []])
|
|
|
|
+ // ];
|
|
// $params['sign'] = (new LegacySignature($this->merchant))->sign($params);
|
|
// $params['sign'] = (new LegacySignature($this->merchant))->sign($params);
|
|
-// $response = $api->request('POST', '/pay/unifiedorder', [
|
|
|
|
-// 'xml' => $params
|
|
|
|
-// ]);
|
|
|
|
|
|
+ // $response = $api->request('POST', '/pay/unifiedorder', [
|
|
|
|
+ // 'xml' => $params
|
|
|
|
+ // ]);
|
|
return $result;
|
|
return $result;
|
|
}
|
|
}
|
|
- public static function order($order, $user){
|
|
|
|
- $app = self::pay();
|
|
|
|
- $api = $app->getClient();
|
|
|
|
|
|
+
|
|
|
|
+ public static function order($order, $user)
|
|
|
|
+ {
|
|
|
|
+ $app = self::pay();
|
|
|
|
+ $api = $app->getClient();
|
|
$config = $app->getConfig();
|
|
$config = $app->getConfig();
|
|
$detail = [];
|
|
$detail = [];
|
|
foreach ($order->shops as $key => $value) {
|
|
foreach ($order->shops as $key => $value) {
|
|
- $money = $value->price;
|
|
|
|
- $detail[] = [
|
|
|
|
- 'goods_id'=> $value->id,
|
|
|
|
- 'wxpay_goods_id'=> $value->id,
|
|
|
|
- 'goods_name'=> $value->material->type_name,
|
|
|
|
- 'quantity'=> 1,
|
|
|
|
- 'price'=> $money,
|
|
|
|
- 'goods_category'=> $value->material->type_name,
|
|
|
|
- 'body'=> $value->material->type_name . '-' . $value->material->material_name
|
|
|
|
- ];
|
|
|
|
|
|
+ $money = $value->price;
|
|
|
|
+ $detail[] = [
|
|
|
|
+ 'goods_id' => $value->id,
|
|
|
|
+ 'wxpay_goods_id' => $value->id,
|
|
|
|
+ 'goods_name' => $value->material->type_name,
|
|
|
|
+ 'quantity' => 1,
|
|
|
|
+ 'price' => $money,
|
|
|
|
+ 'goods_category' => $value->material->type_name,
|
|
|
|
+ 'body' => $value->material->type_name . '-' . $value->material->material_name,
|
|
|
|
+ ];
|
|
}
|
|
}
|
|
$params = [
|
|
$params = [
|
|
- "appid" => $config['app_id'],
|
|
|
|
- "mch_id" => $config['mch_id'],
|
|
|
|
- "device_info" => $user->id,
|
|
|
|
- "nonce_str" => Str::random(),
|
|
|
|
- "openid" => $user->mini_openid,
|
|
|
|
- "body" => "小程序购买商品",
|
|
|
|
- "out_trade_no"=> $order->out_trade_no,
|
|
|
|
- "total_fee"=> $order->amount,
|
|
|
|
- "spbill_create_ip" => "47.93.12.114",
|
|
|
|
- // "time_start"=> $order->created_at->format('YmdHis'),
|
|
|
|
- // "time_expire"=> $order->created_at->addMinutes(30)->format('YmdHis'),
|
|
|
|
- "notify_url"=> 'https://t28.9026.com/api/wechat/pay/callback',
|
|
|
|
- "trade_type"=> 'JSAPI',
|
|
|
|
- "detail"=> json_encode(['goods_detail'=> $detail])
|
|
|
|
|
|
+ 'appid' => $config['app_id'],
|
|
|
|
+ 'mch_id' => $config['mch_id'],
|
|
|
|
+ 'device_info' => $user->id,
|
|
|
|
+ 'nonce_str' => Str::random(),
|
|
|
|
+ 'openid' => $user->mini_openid,
|
|
|
|
+ 'body' => '小程序购买商品',
|
|
|
|
+ 'out_trade_no' => $order->out_trade_no,
|
|
|
|
+ 'total_fee' => $order->amount,
|
|
|
|
+ 'spbill_create_ip' => '47.93.12.114',
|
|
|
|
+ // "time_start"=> $order->created_at->format('YmdHis'),
|
|
|
|
+ // "time_expire"=> $order->created_at->addMinutes(30)->format('YmdHis'),
|
|
|
|
+ 'notify_url' => 'https://t28.9026.com/api/wechat/pay/callback',
|
|
|
|
+ 'trade_type' => 'JSAPI',
|
|
|
|
+ 'detail' => json_encode(['goods_detail' => $detail]),
|
|
];
|
|
];
|
|
// $params['sign'] = (new LegacySignature($this->merchant))->sign($params);
|
|
// $params['sign'] = (new LegacySignature($this->merchant))->sign($params);
|
|
$response = $api->request('POST', '/pay/unifiedorder', [
|
|
$response = $api->request('POST', '/pay/unifiedorder', [
|
|
- 'xml' => $params
|
|
|
|
|
|
+ 'xml' => $params,
|
|
]);
|
|
]);
|
|
- return $response->toArray(false);
|
|
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ return $response->toArray(false);
|
|
|
|
+ }
|
|
|
|
|
|
- public static function queryOrder($out_trade_no){
|
|
|
|
- $app = self::pay();
|
|
|
|
- $api = $app->getClient();
|
|
|
|
|
|
+ public static function queryOrder($out_trade_no)
|
|
|
|
+ {
|
|
|
|
+ $app = self::pay();
|
|
|
|
+ $api = $app->getClient();
|
|
$config = $app->getConfig();
|
|
$config = $app->getConfig();
|
|
- $params = [
|
|
|
|
- "appid" => $config['app_id'],
|
|
|
|
- "mch_id" => $config['mch_id'],
|
|
|
|
- "out_trade_no"=> $out_trade_no,
|
|
|
|
- "nonce_str" => Str::random(),
|
|
|
|
- ];
|
|
|
|
- $response = $api->request('POST', '/pay/orderquery', [
|
|
|
|
- 'xml' => $params
|
|
|
|
|
|
+ $params = [
|
|
|
|
+ 'appid' => $config['app_id'],
|
|
|
|
+ 'mch_id' => $config['mch_id'],
|
|
|
|
+ 'out_trade_no' => $out_trade_no,
|
|
|
|
+ 'nonce_str' => Str::random(),
|
|
|
|
+ ];
|
|
|
|
+ $response = $api->request('POST', '/pay/orderquery', [
|
|
|
|
+ 'xml' => $params,
|
|
]);
|
|
]);
|
|
- return $response->toArray(false);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
+ return $response->toArray(false);
|
|
|
|
+ }
|
|
|
|
|
|
- public static function build_order_no() {
|
|
|
|
- return date('Ymd').substr(implode('', array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
|
|
|
|
- }
|
|
|
|
|
|
+ public static function build_order_no()
|
|
|
|
+ {
|
|
|
|
+ return date('Ymd') . substr(implode('', array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
|
|
|
|
+ }
|
|
}
|
|
}
|