一些关键词
-
商户端私钥:
- 由我们自己生成的RSA私钥(必须与商户端公钥是一对),生成后要保存在服务端,绝对不能保存在客户端,也绝对不能从服务端下发
- 用来对订单信息进行加签,加签过程一定要在服务端完成,绝对不能在客户端做加签工作,客户端只负责用加签后的订单信息调起支付宝来支付
-
商户端公钥:
- 由我们自己生成的RSA公钥(必须与商户端私钥是一对),生成后需要填写在支付宝开放平台
- 用来给支付宝服务端验签经过我们加签后的订单信息,以确保订单信息确实是我们商户端发给支付宝的,并且确保订单信息在传输过程中未被篡改(下面会举例子)
-
支付宝私钥:
- 这个和我们就没关系了,支付宝私钥是人家自己生成的,他们自己保存的
- 用来对支付结果进行加签
-
支付宝公钥:
- 支付宝公钥和支付宝私钥是一对,也是支付宝生成的,当我们把商户端公钥填写在支付宝开放平台后,平台就会给我们生成一个支付宝公钥,我们可以复制下来保存在服务端,同样不要保存在客户端,并且不要下发,避免被反编译或截获,而被篡改支付结果
- 用来让服务端对支付宝服务端返给我们的同步或异步支付结果进行验签,以确保支付结果确实是由支付宝服务端返给我们服务端的,而且没有被篡改,对支付结果的验签工作也一定要在服务端完成,绝对不能在客户端验签,因为支付宝公钥一旦存储在客户端用来验签,那就可能被反编译,这样就谁都可以验签支付结果并篡改了
//在index.php引入文件
require( 'alipay-sdk-PHP/AopSdk.php');
/*发起APP阿里支付订单*/
private function SubmitAlipaysend($body,$subject,$UserId,$OrderId,$PayMoney,$PayType,$NotifyPage)
{
try
{
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = $this->ali_appId; //支付宝分配给开发者的应用ID
$aop->alipayrsaPublicKey =$this->ali_alipayrsaPublicKey; //支付宝公钥
$aop->rsaPrivateKey=$this->ali_rsaPrivateKey; // 请填写开发者私钥去头去尾去回车,一行字符串
$aop->format = "json";//仅支持JSON
$aop->charset = "UTF-8";//请求使用的编码格式,如utf-8,gbk,gb2312
$aop->signType = "RSA2";//目前支持RSA2和RSA,推荐使用RSA2
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request = new \AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$bizcontent = "{\"body\":\"".$body."\","
. "\"subject\": \"".$subject."\","
. "\"out_trade_no\": \"".$OrderId."\","
. "\"timeout_express\": \"30m\","
. "\"total_amount\": \"".$PayMoney."\","
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl("/web/admin/api/pay/".$NotifyPage);
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
// echo htmlspecialchars($response);
// 可以直接给客户端请求,无需再做处理。
echo $response ;
die();
}
catch (Exception $ex)
{
echo $ex->getMessage();
}
}