支付宝付款,开发上比起微信支付要简单很多,今天就以支付宝手机网站支付为例,简单讲一下实现方法:
前期准备,当然就不多说了,当你想开发使用支付宝支付,必然需要在支付宝开放品台注册认证并且创建好应用并且具备手机网站支付功能!不明白可以查看支付宝官方文档(https://docs.open.alipay.com/203/107084/)
一.开发准备
开发之前,需要准备以下信息
1.支付宝应用appid
2.明确接口加密方式(RSA或者RSA2)
3.支付宝公钥
4.应用私钥
二.支付实现
话不多说,直接上代码
/*** 将要参与签名的参数按要求拼接* @param $data* author 江南极客* @return string*/
function signQueryString($data){// 去空$data = array_filter($data);//签名步骤一:按字典序排序参数ksort($data);$string_a = http_build_query($data);$string_a = urldecode($string_a);return $string_a;
}/*** 支付宝RSA签名加密* @param $data 要参与加密的参数* @param $private_key 应用私钥* author 江南极客* @return array|string*/
function RSASign($data,$private_key){//要签名的参数字符串$query_string = signQueryString($data);//应用私钥$private_key = chunk_split($private_key, 64, "\n");$private_key = "-----BEGIN RSA PRIVATE KEY-----\n$private_key-----END RSA PRIVATE KEY-----\n";$private_key_id = openssl_pkey_get_private($private_key);if ($private_key_id === false){return array(-1,'提供的私钥格式不对');}$rsa_sign = false;if($data['sign_type'] == 'RSA'){$rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA1);}else if($data['sign_type'] == 'RSA2'){$rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA256);}//释放资源openssl_free_key($private_key_id);if ($rsa_sign === false){return array(-1,'签名失败');}$signature = base64_encode($sign);return $signature;
}/*** 支付宝支付* @param array $params 构造好的支付参数* author 于先生吖* @return array|string*/
function aliPay(array $params){$public = ['app_id' => $params['app_id'],'method' => $params['method'],'sign_type' => $params['sign_type'],'format' => 'JSON','charset' => 'utf-8','version' => '1.0','timestamp' => date('Y-m-d H:i:s'),'biz_content' => $params['biz_content'],];if(!empty($params['notify_url'])){$public['notify_url'] = $params['notify_url'];}if(!empty($params['return_url'])){$public['return_url'] = $params['return_url'];}$sign = RSASign($public,$params['private_key']);if(is_array($sign)){return $sign;}$public['sign'] = $sign;$url = 'https://mapi.alipay.com/gateway.do?'. http_build_query($public,'', '&');return $url;
}
注:这里的支付网关,如果是新接口是(https://openapi.alipay.com/gateway.do)
调用实例:
$biz_content = ['body' => '测试商品x1','subject' => '测试商品','out_trade_no' => date('YmdHis').rand(1000,9999),'product_code' => 'QUICK_WAP_WAY','total_amount' => 0.01,
];
$notify_url = "https://xxxxxxxx/notify.php"; //通知回调地址(必须是可以无障碍访问没有登录验证的地址)
$params = ['app_id' => '2017xxxxxxxxx6554', //appid'method' => 'alipay.trade.wap.pay', //接口名称'sign_type' => 'RSA2', //签名加密方式'notify_url' => $notify_url,'biz_content' => json_encode($biz_content), //请求参数
];
$params['private_key'] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //应用私钥
$data = aliPay($params);
print_r($data);
三.回调验签
对于手机网站支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统。支付宝异步回调通知POST过来的数据如下
在拿到这个数据之后,为了安全防止数据被篡改,需要签证签名,方法如下:
/*** 支付宝验证签名* @param $return_data 支付宝服务器推送给notify_url的数据* @param $public_key 支付宝公钥* author 于先生吖* @return bool|int*/
function RSAVerify($return_data, $public_key){if(empty($return_data) || !is_array($return_data)){return false;}//支付宝公钥$public_key = wordwrap($public_key, 64, "\n", true);$public_key = "-----BEGIN PUBLIC KEY-----\n$public_key\n-----END PUBLIC KEY-----\n";$public_key_id = openssl_pkey_get_public($public_key);if($public_key_id === false){return false;}//除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。$sign = $return_data['sign'];$sign_type = trim($return_data['sign_type'],'"');unset($return_data['sign'], $return_data['sign_type']);$query_string = signQueryString($return_data);$sign = base64_decode($sign);$rsa_verify = 0;if($sign_type == 'RSA'){$rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA1);}else if($sign_type == 'RSA2'){$rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA256);}openssl_free_key($public_key_id);if($rsa_verify == 0 || $rsa_verify == -1){//Returns 1 if the signature is correct, 0 if it is incorrect, and -1 on error.return false;}return $rsa_verify;
}
其余支付宝其他支付方式(扫码支付,PC支付,APP支付等),实现方式大同小异,修改几个参数就OK了!