着实被几个钥给恶心到了。
整个过程中,最蛋疼的是,可以支付成功,但是异步回调老是报错,验证不过去,不好意思,花了两天时间...先把这个解决办法说下吧。
function notify() {
$aop = new AopClient;
$aop->alipayrsaPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA70UfUntg80gXhzKby5opWNhzmIKDRLs78htUGRqtktbR8zGG7eqva0xV2MEtkqgoxuf26zymdK1oNCliX2dO+95r6pLb8zkVOH7eBKSt/TaL+YxVkPOFkuBLFeBI67Qj8eY63E1xdCgwGIEowTydpRhkbTCvCVXjQRlY9TqWOTEtQVScZj3lWgKg61A26608vs/WtsUD5Or/h/n0M7mZzEzNVyCu8xgQDHoW80kY1ovkuEGER0pj3QbGi4ECBmTlwQ/ZX/K9q7cnePB7Y4SJ6rww6TvT9AWdkzLVVd1NO9qhHqMBwtc5nYFW1qEK+ExeEOXnoRTFwtOjDH6JcRlZ4wIDAQAB';
// 下面这里是我处理后的方法 去掉回调拿到的值 三个反斜杠!!!
$data = $_POST;
$data['fund_bill_list'] = str_replace('\\', '', $data['fund_bill_list']);
//此处验签方式必须与下单时的签名方式一致
$flag = $aop->rsaCheckV1( $data, NULL, "RSA2" );
if ( $flag ) {
file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."----111-----".json_encode( $data ).$flag."\n\r",FILE_APPEND);
file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."----112-----".json_encode( $_POST ).$flag."\n\r",FILE_APPEND);
}else{
file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."-----222----".json_encode( $data )."\n\r",FILE_APPEND);
file_put_contents("lwlog.txt",date('Y-m-d H:i:s',time())."-----223----".json_encode( $_POST ).$flag."\n\r",FILE_APPEND);
}
echo 'success';
die;
}
- 上面是对
$_POST
提了出来额外做了处理。
处理前
"fund_bill_list":"[{\\\"amount\":\\\"0.01\\\",\\\"fundChannel\\\":\\\"ALIPAYACCOUNT\\\"}]",
处理后
"fund_bill_list":"[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
- 另外就是仔细比对的自己的私钥和支付宝公钥是否有误差。
开始接入
一 、 了解配置基本信息
- 基本操作
- 配置支付信息
- 生成密钥的链接打开后,就是下面的样子。这里以 windows 为例子。下载签名工具,很容易获取到自己的私钥 和公钥。这里注意的是,尽量都用 RSA2 的签名工具,以免后面带来麻烦.
生成自己的密钥
上传或者修改自己的密钥
- 配置后
自己的应用信息
几个比较重要的,都被我用红圈圈了起来。可以看到截图下面有两个公钥,左边是你刚刚上传给支付宝的,右边是支付宝处理后的,我们所有的 PHP-SDK 代码里使用的公钥用的都是右边的!!!支付宝公钥官方释义
二 、 准备开发
- 服务端 & 客户端
贴下服务端代码
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
//实际上线app id需真实的
$aop->appId = "你的 appid ";
$aop->rsaPrivateKey = ' 你的私钥 ';
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = ' 支付宝给你的公钥 ';
$bizcontent = json_encode([
'body'=>'GOODS',
'subject'=>'clothes',
'out_trade_no'=>$ord_num,//此订单号为商户唯一订单号
'total_amount'=> '0.01',//保留两位小数
'product_code'=>'QUICK_MSECURITY_PAY'
]);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request1 = new \AlipayTradeAppPayRequest();
//支付宝回调
$request1->setNotifyUrl( "你的回调方法的 url " );
$request1->setBizContent( $bizcontent );
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute( $request1 );
return $response;
- 上面的回调地址对应的方法
function notify()
{
// require_once('/www/my/app/third_party/alipay/aop/AopClient.php');
$aop = new AopClient;
$aop->alipayrsaPublicKey = ' 支付宝给你的公钥 ';
//此处验签方式必须与下单时的签名方式一致
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
if ( $flag ) {
// file_put_contents("log.txt", "This is another something.", FILE_APPEND);
// file_put_contents("log.txt", "This is another something12312313.");
file_put_contents("/tmp/log.txt",date('Y-m-d H:i:s',time())."---------".json_encode($_POST)."\n\r",FILE_APPEND);
}else{
file_put_contents("/tmp/log.txt",date('Y-m-d H:i:s',time())."-----222222----".json_encode($_POST)."\n\r",FILE_APPEND);
}
// var_dump( $flag );
//验签通过后再实现业务逻辑,比如修改订单表中的支付状态。
/**
①验签通过后核实如下参数trade_status、out_trade_no、total_amount、seller_id
②修改订单表
**/
//打印success,应答支付宝。必须保证本界面无错误。只打印了success,否则支付宝将重复请求回调地址。
echo 'success';
die;
}
总的来说,你手上会有三个钥,你的公钥的任务就是换到支付宝给你的公钥。随后的开发用的都是支付宝的公钥!!!