yansongda / pay Goto Github PK
View Code? Open in Web Editor NEW可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了
Home Page: http://pay.yansongda.cn
License: MIT License
可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了
Home Page: http://pay.yansongda.cn
License: MIT License
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
调用转账接口的时候出现这个问题,是什么原因导致的呢?(用的沙箱环境,正式环境没有条件测试)
成功:
$data = ["return_code" => "SUCCESS", "return_msg" => "SUCCESS"];
echo $this->toXml($data);
失败:
$data = ["return_code" => "FAIL", "return_msg" => "ERROR"];
echo $this->toXml($data);
支付宝则需要返回success或者failure
建议形式修改为:
$pay = (new Pay($this->config))->driver('alipay');
if(! $pay->verify($request->all())) {
return $pay->replyErrorNotify();
}
return $pay->replySuccessNotify();
第一,您在接受支付宝、微信异步通知后,只进行了验签工作,个人觉得,这里应该在主动查询下第三方,以确保订单完成支付。防止秘钥暴露等其他情况,导致验签结果与实际情况不符。
第二,当订单涉及到有自动取消时间的时候,这样就需要我们使用脚本定时取消第三方订单。以免用户订单已取消,但实际第三方支付还是可以继续操作。我记得好像,调用微信的取消订单接口。不管订单号是否真实存在,都会返回成功。而支付宝貌似只有关闭订单操作。如果支付包订单已经支付完成,我们因为其他原因没有及时接到支付宝的异步通知,这时候,我们主动请求关闭订单,支付宝会将已经支付完成的地方关闭,并退款。
故而希望,新增主动查询订单状态功能
希望补充完善支付log功能,用monolog/monolog实现就不错。最好log地址可自定义配置
代码最好【便于】使用者扩展其他支付(苹果内支付、银联支付等等)。
支付宝手机网页支付,无法收到异步通知
这绝对是世界上最好的微信呸 / 阿里呸 Composer包了.
虽然使用过程中还是遇到不少问题, 但都是微信的锅.
^2.0
异步通知总是Alipay Sign verify FAILED,我是沙盒测试,不知道是才有这问题 还是犯了什么错误
涉及到 异步通知、同步通知 的问题,请将 nginx/Apache 的相关日志贴出来
$alipay = PayApi::alipay( $config );
$data = $alipay->verify(); // 是的,验签就这么简单!
Alipay Sign verify FAILED
调用微信APP下单API后会获取到prepayid这个参数,我看了微信文档说这个参数要额外进行一次签名,看了下你的code好像没有对这个参数进行额外的签名。
微信支付结果通知 API 文档中说只有当 return_code
(通信标识) 为 SUCCESS
时,返回信息中才有 sign
等字段,所以当 return_code
(通信标识) 为 FAIL
时,下面这段代码会因为找不到 $data['sign']
报错吧?
public function verify($data, $sign = null, $sync = false)
{
$data = $this->fromXml($data);
$sign = is_null($sign) ? $data['sign'] : $sign;
return $this->getSign($data) === $sign ? $data : false;
}
小程序支付getResult error:签名错误,miniapp_id、mch_id、key核对好几遍了没有问题,但是还是一直保持
{
"message": "getResult error:签名错误",
"code": 20000,
"status_code": 500,
"debug": {
"line": 219,
"file": "/home/vagrant/Code/Laravel/ShareLoverServer/vendor/yansongda/pay/src/Gateways/Wechat/Wechat.php",
"class": "Yansongda\\Pay\\Exceptions\\GatewayException",
"trace": [
"#0 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/yansongda/pay/src/Gateways/Wechat/Wechat.php(179): Yansongda\\Pay\\Gateways\\Wechat\\Wechat->getResult('pay/unifiedorde...')",
"#1 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/yansongda/pay/src/Gateways/Wechat/MiniappGateway.php(42): Yansongda\\Pay\\Gateways\\Wechat\\Wechat->preOrder(Array)",
"#2 /home/vagrant/Code/Laravel/ShareLoverServer/app/Api/Controllers/Order/OrderController.php(210): Yansongda\\Pay\\Gateways\\Wechat\\MiniappGateway->pay(Array)",
"#3 [internal function]: App\\Api\\Controllers\\Order\\OrderController->create(Object(Dingo\\Api\\Http\\Request))",
"#4 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)",
"#5 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('create', Array)",
"#6 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Api\\Controllers\\Order\\OrderController), 'create')",
"#7 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Route.php(162): Illuminate\\Routing\\Route->runController()",
"#8 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Router.php(610): Illuminate\\Routing\\Route->run()",
"#9 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#10 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/tymon/jwt-auth/src/Middleware/GetUserFromToken.php(46): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#11 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Tymon\\JWTAuth\\Middleware\\GetUserFromToken->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#12 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#13 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/dingo/api/src/Http/Middleware/PrepareController.php(45): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#14 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Dingo\\Api\\Http\\Middleware\\PrepareController->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#15 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#16 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#17 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Router.php(612): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
"#18 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Router.php(571): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Dingo\\Api\\Http\\Request))",
"#19 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Router.php(549): Illuminate\\Routing\\Router->dispatchToRoute(Object(Dingo\\Api\\Http\\Request))",
"#20 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/dingo/api/src/Routing/Adapter/Laravel.php(81): Illuminate\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))",
"#21 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/dingo/api/src/Routing/Router.php(513): Dingo\\Api\\Routing\\Adapter\\Laravel->dispatch(Object(Dingo\\Api\\Http\\Request), 'v1')",
"#22 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/dingo/api/src/Http/Middleware/Request.php(126): Dingo\\Api\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))",
"#23 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(114): Dingo\\Api\\Http\\Middleware\\Request->Dingo\\Api\\Http\\Middleware\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#24 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/fideloper/proxy/src/TrustProxies.php(56): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#25 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fideloper\\Proxy\\TrustProxies->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#26 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#27 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#28 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#29 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#30 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#31 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#32 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#33 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#34 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))",
"#35 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/dingo/api/src/Http/Middleware/Request.php(127): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
"#36 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/dingo/api/src/Http/Middleware/Request.php(103): Dingo\\Api\\Http\\Middleware\\Request->sendRequestThroughRouter(Object(Dingo\\Api\\Http\\Request))",
"#37 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Dingo\\Api\\Http\\Middleware\\Request->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))",
"#38 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))",
"#39 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))",
"#40 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))",
"#41 /home/vagrant/Code/Laravel/ShareLoverServer/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))",
"#42 /home/vagrant/Code/Laravel/ShareLoverServer/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))",
"#43 {main}"
]
}
}
我使用的是支付宝沙箱环境
,可能与此有关。
根据异步回调接口捕捉到的通知消息,支付宝返回的trade_status
为TRADE_SUCCESS
,是已经支付成功的,但使用
Pay::driver('alipay')->gateway()->verify($request->all())
签名验证是不通过的。
支付宝异步通知数据,charset为GBK,subject为乱码,导致验签失败。当subject为英文时,验签通过。
支付宝除了web,wap,app这3个网关正常,其它的都报错了
exception 'ReflectionException' with message 'Method GuzzleHttp\Client::post() does not exist'
2
用1.x版本的时候,是在微信返回值外包了层script,能返回到支付的地址上
return '<script>window.location.href = "'.$pay->driver('wechat')->gateway('wap')->pay($config_biz).'";</script>';
用2.x的时候,微信方法会直接返回跳转刷新的代码了,但是返回的不是支付打开的那个地址是再之前的那个页面会被刷新,因为我做的是那个页面是商品详情页,下单成功后ajax返回了下单信息,然后在详情页上点的支付链接
这样就造成了支付完之后原来那个商品的详情页被刷新了,不能跳到成功支付的提示页面上去。
有人遇到这种情况,怎么解决的么?
`HTTP/1.0 302 Found
Cache-Control: no-cache, private
Date: Wed, 10 Jan 2018 07:52:38 GMT
Location: https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180110155238cacaca91720685509580&package=3552120091
<title>Redirecting to https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180110155238cacaca91720685509580&package=3552120091</title>
</head>
<body>
Redirecting to <a href="https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180110155238cacaca91720685509580&package=3552120091">https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20180110155238cacaca91720685509580&package=3552120091</a>.
</body>
微信小程序支付的API具体路径放在哪?
'cert_client' => './apiclient_cert.pem',
'cert_key' => './apiclient_key.pem',
我的签名验证失败,找了半天都没找到哪儿的问题。。。
"yansongda/laravel-pay": "dev-master"
支付宝异步通知编码错误
涉及到 异步通知、同步通知 的问题,请将 nginx/Apache 的相关日志贴出来
Alipay::verify里data从gb2312转为utf-8,
Support::verifySign里
$toVerify = $sync ? mb_convert_encoding(json_encode($data, JSON_UNESCAPED_UNICODE), 'gb2312', 'utf-8') : self::getSignContent(Arr::encoding($data, 'gb2312', 'utf-8'), true);
subject是中文的话,导致签名错误
我把两次编码转换注释后签名正常
"yansongda/laravel-pay": "^2.0"
支付宝回调,商品名称包含中文,subject乱码导致验签失败,测试subject纯英文验签成功,已检查密无误,只有当subject有中文时才会验签失败,纯英文直接通过验签
调用代码
$config_order = [
'out_trade_no' => $orders->number,
'total_amount' => $orders->payment_total,
'subject' => 'test-测试',
];
$alipay = Pay::alipay();
return $alipay->app($config_order);
接受回调信息代码
public function notify()
{
$alipay = Pay::alipay();
try {
$data = $alipay->verify();
\Log::notice('Alipay return information: ', [
'data' => $data->all()
]);
} catch (\Exception $exception) {
\Log::notice('Alipay send error: ', [
'errors:' => $exception->getMessage(),
]);
}
}
纯英文log 详情
验签成功!
laravel log
验签成功!
当subject包含中文时,subject 乱码 验签失败
中文log详情
验签失败!
支付宝退款调用不成功,是不是我这配置有问题,求解
$config_biz = [
'out_trade_no' => $TempOrderId, // 订单号
'refund_amount' => $price, //退款金额
'subject' => '正常退款', //订单标题
];
$pay = new pay($this->config);
$resultCode = $pay->driver('alipay')->gateway('Web')->refund($config_biz);
cURL error 35: timed out before SSL handshake (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
此包最新版
想做银联,各个银行的支付。不知道是否可以直接通过配置后,就可以简单使用呢?
2.X
Class 'Yansongda\Pay\Gateways\Wechat\Log' not found
涉及到 异步通知、同步通知 的问题,请将 nginx/Apache 的相关日志贴出来
src/Gateways/Wechat/AppGateway.php 36line
使用说明的第0部分
$pay = new Pay($config); return $pay->dirver('alipay')->gateway('web')->pay($config_biz);
应该改成
$pay = new Pay($config); return $pay->driver('alipay')->gateway('web')->pay($config_biz);
可以考虑增加支付宝支付能力中其他接口
如转账到支付宝帐户https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.YGnnYd&treeId=193&articleId=106236&docType=1
支付宝支付成功,返回回调地址时出现:The Response content must be a string or object implementing __toString(), "boolean" given.
路由:
// 支付宝回调地址
Route::get('alipay/return','AliPayController@return');
// 支付宝异步通知
Route::post('alipay/notify','AliPayController@notify');
// 支付地址
Route::get('alipay','AliPayController@pay');
控制器:
`
namespace App\Http\Controllers;
use Pay;
use Illuminate\Http\Request;
class AliPayController extends Controller
{
public function pay ()
{
$config_biz = [
'out_trade_no' => time(),
'total_amount' => '0.01',
'subject' => 'test',
];
return Pay::driver('alipay')->gateway()->pay($config_biz);
}
public function return(Request $request)
{
return Pay::driver('alipay')->gateway()->verify($request->all());
}
public function notify(Request $request)
{
if (Pay::driver('alipay')->gateway()->verify($request->all())) {
file_put_contents(storage_path('notify.txt'), "收到来自支付宝的异步通知\r\n", FILE_APPEND);
file_put_contents(storage_path('notify.txt'), '订单号:' . $request->out_trade_no . "\r\n", FILE_APPEND);
file_put_contents(storage_path('notify.txt'), '订单金额:' . $request->total_amount . "\r\n\r\n", FILE_APPEND);
} else {
file_put_contents(storage_path('notify.txt'), "收到异步通知\r\n", FILE_APPEND);
}
echo "success";
}
}
`
错误信息:
`*
* @param mixed $content Content that can be cast to string
*
* @return $this
*
* @throws \UnexpectedValueException
*/
public function setContent($content)
{
if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, '__toString'))) {
throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', gettype($content)));
}
$this->content = (string) $content;
return $this;
}
/**
* Gets the current response content.
*
* @return string Content
*/
public function getContent()
{
return $this->content;
}
/**
* Sets the HTTP protocol version (1.0 or 1.1).
*
Arguments
"The Response content must be a string or object implementing __toString(), "boolean" given."`
yansongda/laravel-pay": "^1.0"
支付宝异步回调验签失败,已检查公钥设置,打印 回调验签信息,发现中文变成了乱码,是不是这个原因引起验签失败??
if (Pay::driver('alipay')->gateway()->verify($request->all())) {
if ($request->has('trade_status')) {
switch ($request->trade_status) {
case 'TRADE_SUCCESS':
case 'TRADE_FINISHED':
$orders = Orders::query()->where('number', $request->out_trade_no)->first();
if ($orders) {
$user = User::query()->findOrFail($orders->user_id);
if ($orders->payment_total == $request->total_amount) {
if ($orders->payment_state == 0) {
$user->increment('integral', $orders->payment_total);
event(new integral($user, '消费, ' . '订单号' . $orders->number, '+ ' . $orders->payment_total));
$orders->payment_state = 1;
$orders->payment_method = 1;
$orders->state = 1;
event(new LessStock($orders));
$orders->save();
}
}
}
break;
}
return 'success';
}
} else {
return 'fail';
}
支付宝回调部分信息
"subject":"Art Life �~X��~I��~N� �~T��~^~K","sign":"m/jE++9t
在做Api接口时返回给前端的timeStamp
类型是Int
类型,当jsApi
直接调用此返回参数时,报错timeStamp不存在
,改为String
类型就好了,建议直接在生成支付参数时就改为String
类型
public function pay(array $config_biz = [])
{
if (is_null($this->user_config->get('app_id'))) {
throw new InvalidArgumentException('Missing Config -- [app_id]');
}
$payRequest = [
'appId' => $this->user_config->get('app_id'),
- 'timeStamp' => time(),
+ 'timeStamp' => (string)time(),
'nonceStr' => $this->createNonceStr(),
'package' => 'prepay_id='.$this->preOrder($config_biz)['prepay_id'],
'signType' => 'MD5',
];
$payRequest['paySign'] = $this->getSign($payRequest);
return $payRequest;
}
目前文档中已说明所有网关均支持 refund 方法,支付宝退款 $config_biz 传入订单号即可,但微信支付退款传入的配置项并未说明,建议完善一下退款的文档哦,谢谢。
使用你列子中的回调方法,支付宝回调用回调地址后数据是以POST方式返回回来的,请问你的notify 函数规定了类型,导致我一直接收不到支付宝回调信息,我改为了$_POST去接收,但是这样就需要修改你封装好的文件里面的东西,所以想问一下,是我这边有什么代码没有配置上还是怎么回事
Severity: 4096
Message: Argument 1 passed to Alipay_notify_controller::notify() must be an instance of Illuminate\Http\Request, none given
Filename: controllers/Alipay_notify_controller.php
Line Number: 16
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at [email protected] to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
get方式测试支付 请求过去直接报500
2.0.6
微信沙箱模式接口调用失败
涉及到 异步通知、同步通知 的问题,请将 nginx/Apache 的相关日志贴出来
Yansongda\Pay\Exceptions\GatewayException: Get Wechat API Error:验证签名失败, 请调用getsignkey生成沙箱密钥 in file E:\Server\www\project\vendor\yansongda\pay\src\Gateways\Wechat\Support.php on line 72
Stack trace:
用示例做的
$pay->driver('alipay')->gateway()->verify($request->all())
一直返回false
测试数据是支付宝同步return_url中GET的数据
异步通知这步也是验证失败
顺便问下异步通知中gateway类型有关么?比如用wap支付的,这里是否能验证通过?
还有微信的也是如此,支付的时候可能会用h5的wap和mp等,异步通知里能否wap一个网关来做回调数据的验证?我目前只做了wap支付,异步通知数据验证通过了
复制你代码是调用 notify方法 报错
微信支付
convert to array error !invalid xml
使用微信H5支付成功后,在 notify 函数里面写成功后的业务逻辑不起作用,也没报错,感觉就是整个流程没走 notify_url 这一步。设置了 return_url 后到是有返回这里,但看文档里说这个地方仅仅只是做跳转用,请问支付成功后在哪做数据处理呢?
2.x
请问有没有集成支付宝在微信中的跳转支付呢,该如何使用?
回调地址没有配置错,域名也在小程序后台添加了,是认证的https链接,但是支付成功后没有收到回调
https://sharelover.cnxz999.com/api/lover/order/weapp_notify
我是一家做 multi-payment gateway 公司的產品負責人,現在我的項目要支持微信香港錢包,但全部的 endpoint 都跟國內錢包的不一樣。我也想 contribute 到這裡來,但我看到 namespace 已經用了 Wechat
做國內錢包。
所以我想問的是,對於這個狀況會有什麼建議嗎?
我的支付宝验证方式为RSA,该如何配置
如题
支付宝异步认证的时候问题
public function verify($data, $sign = null, $sync = false)
{
if (is_null($this->user_config->get('ali_public_key'))) {
throw new InvalidArgumentException('Missing Config -- [ali_public_key]');
}$sign = is_null($sign) ? $data['sign'] : $sign; $res = "-----BEGIN PUBLIC KEY-----\n". wordwrap($this->user_config->get('ali_public_key'), 64, "\n", true). "\n-----END PUBLIC KEY-----"; $toVerify = $sync ? json_encode($data) : $this->getSignContent($data, true); return openssl_verify($toVerify, base64_decode($sign), $res, OPENSSL_ALGO_SHA256) === 1 ? $data : false; }
与配置项不一样
使用这个包时,对小程序的小程序的订单退款时会报appid参数长度不够,不管设置成appid 还是 miniapp_id
protected function getResult($end_point, $cert = false)
{
$this->config['sign'] = $this->getSign($this->config);
if ($cert) {
$data = $this->fromXml($this->post(
$end_point,
$this->toXml($this->config),
[
'cert' => $this->user_config->get('cert_client', ''),
'ssl_key' => $this->user_config->get('cert_key', ''),
]
));
} else {
$data = $this->fromXml($this->post($end_point, $this->toXml($this->config)));
}
if (!isset($data['return_code']) || $data['return_code'] !== 'SUCCESS' || $data['result_code'] !== 'SUCCESS') {
$error = 'getResult error:'.$data['return_msg'];
$error .= isset($data['err_code_des']) ? ' - '.$data['err_code_des'] : '';
}
if (!isset($error) && $this->getSign($data) !== $data['sign']) {
$error = 'getResult error: return data sign error';
}
if (isset($error)) {
throw new GatewayException(
$error,
20000,
$data);
}
return $data;
}
getResult error:appid参数长度有误
wechat.php 文件的够着函数接收 小程序的appid
$this->config = [
'appid' =>empty($this->user_config->get('app_id', ''))?$this->user_config->get('miniapp_id', ''):$this->user_config->get('app_id', ''),
'mch_id' => $this->user_config->get('mch_id', ''),
'nonce_str' => $this->createNonceStr(),
'sign_type' => 'MD5',
'notify_url' => $this->user_config->get('notify_url', ''),
'trade_type' => $this->getTradeType(),
];
yansongda\pay\src\Gateways\Wechat\Wechat.php
/**
* 验证退款数据
/
public function verifyRefund($data)
{
$data = $this->fromXml($data);
$key = md5($this->user_config->get('key'));
$decrypt_data = $this->refund_decrypt($data['req_info'],$key);
return $this->fromXml($decrypt_data);
}
/*
* 解密数据
*/
public function refund_decrypt($str, $key) {
$str = base64_decode($str);
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
$block = mcrypt_get_block_size('rijndael_128', 'ecb');
$pad = ord($str[($len = strlen($str)) - 1]);
$len = strlen($str);
$pad = ord($str[$len - 1]);
return substr($str, 0, strlen($str) - $pad);
}
$pay = new Pay($this->config);
$verify = $pay->driver('wechat')->gateway('mp')->verifyRefund($data);
2.0
public function pay($endpoint, array $payload): Response
{
$payload['method'] = $this->getMethod();
$payload['biz_content'] = json_encode(array_merge(
json_decode($payload['biz_content'], true),
['product_code' => $this->getProductCode()]
));
$payload['sign'] = Support::generateSign($payload, $this->config->get('private_key'));
Log::debug('Paying A Web/Wap Order:', [$endpoint, $payload]);
// 这里我想返回url,而不是form表单
return $endpoint . '?' . http_build_query($payload);
return $this->buildPayHtml($endpoint, $payload);
}
test
test
test
按照文档上写的代码,直接请求提示 Missing Config -- [appid]
public function wxPay(){
$config = [
'wechat' => [
'app_id' => 'xxx',
'mch_id' => 'xxx',
'notify_url' => 'http://yansongda.cn/wechat_notify.php',
'key' => 'xxx',
'cert_client' => './apiclient_cert.pem',
'cert_key' => './apiclient_key.pem',
],
];
$config_biz = [
'out_trade_no' => 'e2',
'total_fee' => '1', // 单位:分
'body' => 'test body',
'spbill_create_ip' => '8.8.8.8',
'openid' => '123',
];
$pay = new Pay($config);
return $pay->driver('wechat')->gateway('app')->pay($config_biz);
}
暂时只获取到md5的秘钥,该如何配置呢?
Null
Null
Null
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.