签名和验签在APP端也是可以完成的,考虑到安全问题,签名和验签最好在服务端完成,支付宝官方建议也是这样的,所以php端需要把签名好的参数传给APP端。详细步骤见正文:
一、 下载php支付宝sdk
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.eCtVsf&treeId=54&articleId=103419&docType=1 (旧)
https://docs.open.alipay.com/54/103419/(新)
二、 查看支付宝App支付请求参数文档,拼接请求参数,签名
App支付请求参数说明
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.wM4mV1&treeId=204&articleId=105465&docType=1(旧)
https://docs.open.alipay.com/204/105465/(新)
先是参数拼接生成签名,再把前面的参数和签名进行组装。核心代码如下:
require_once '/Alipay/aop/AopClient.php';
$private_path = "/Alipay/key/rsa_private_key.pem";
$content = array();
$content['subject'] = "商品的标题/交易标题/订单标题/订单关键字等";
$content['out_trade_no'] = "商户网站唯一订单号";
$content['timeout_express'] = "该笔订单允许的最晚付款时间";
$content['total_amount'] = "订单总金额(必须定义成浮点型)";
$content['product_code'] = "QUICK_MSECURITY_PAY";/销售产品码,固定值
$con = json_encode($content);
$Client = new \AopClient();
$param['app_id'] = '支付宝分配给开发者的应用ID';
$param['method'] = 'alipay.trade.app.pay';
$param['charset'] = 'utf-8';
$param['sign_type'] = 'RSA2';
$param['timestamp'] = date("Y-m-d Hi:i:s");
$param['version'] = '1.0';
$param['notify_url'] = '支付宝服务器异步回调地址';
$param['biz_content'] = $con;
$paramStr = $Client->getSignContent($param);
$sign = $Client->alonersaSign($paramStr, $private_path, 'RSA2', true);
$param['sign'] = $sign;
$str = $Client->getSignContentUrlencode($param);
请求的说明,支付宝说的很清楚,这里再重新附上截图:
三、验签
App 支付成功后会有返回字符串,客服端也需要判断,这里不罗嗦,如下图:
下一步就是在php服务端进行验签,支付宝异步会以post方式返回数据到异步回调地址:
function notify()
{
require_once('/alipay/aop/AopClient.php');
$aop = new \AopClient;
$aop->alipayrsaPublicKey = "支付宝公钥";
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
echo 'success';
}
后记:
之前一直验签失败,找了好久,终于解决了。文档中说,验签用的是支付宝公钥,并不是RSA2公钥,这里需要特别注意,不要用错了
请看截图: