即使 身堕 地域. 也要 心怀 天堂.

11月 24

0.00 星 (0 分) - 0 人投票

最近在用apicloud打包制作IOSAPP的时候,吊起支付宝时遇到了一点小问题。
官方文档,用处不大,对错误码的说明,也非常少,不利于开发者阅读和开发。
既然,官方文档不给力,那就自己研究吧!
下载支付宝官方的SDK:https://docs.open.alipay.com/54/103419
对于这个SDK,我感觉过于庞杂了,一般也就是用得到支付、退款、接入登录。但是支付宝这个sdk用了lotusphp的MVC框架,是不是有点过头呢?或许阿里官方的人有更长远的打算吧。

下面开始贴代码:

首先,写配置文件config.php方便签名和验签时调用

$alipay_config=array(
	'app_id' 			=>	'***',//商户密钥
	'seller_id' 		=>	'***',//收款商家账号
	'rsaPrivateKey' 	=>	'**',//私钥
	'rsaPrivateKey' 	=>	'**',//支付宝公钥,注意!不是应用公钥!!!
	'partner'			=>	'**',//商家的id,2088开头,新版已经取消这个参数调用,改为使用app_id,每个商户可申请多个app_id
	'input_charset' 	=>	strtolower('utf-8'),//编码
	'notify_url' 		=>	'http://yourhost/app_alipay_notify.php', //回调地址(支付宝支付成功后回调修改订单状态的地址)
	'payment_type'		=>	1,//(固定值)
	'charset'    		=>	'utf-8',//编码
	'sign_type' 		=>	'RSA2',//签名方式
	'timestamp' 		=>	date("Y-m-d H:i:s"),
	'version'   		=>	"1.0",//固定值
	'url'       		=>	'https://openapi.alipay.com/gateway.do', //固定值
	'method'    		=>	'alipay.trade.app.pay',//固定值
);

然后,是构造支付参数及签名,并返回apicloud上AliPayPlus插件所要提交的参数。所需提交的参数可参照支付宝官方文档APP支付请求参数说明

function alipay_code($out_trade_no,$total_fee){
	require_once("alipay/aop/AopClient.php");

	/*构造业务请求参数的集合(订单信息)*/
	$content = array();
	$content['body'] = '***';//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body
	$content['subject'] = '***商城';//商品的标题/交易标题/订单标题/订单关键字等
	$content['out_trade_no'] = $out_trade_no;//商户网站唯一订单号
	$content['timeout_express'] = '1d';//该笔订单允许的最晚付款时间
	$content['total_amount'] = floatval($total_fee);//订单总金额(必须定义成浮点型)
	$content['seller_id'] = $alipay_config['seller_id'];//收款人账号
	$content['product_code'] = 'QUICK_MSECURITY_PAY';//销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
	$content['store_id'] = 'ZB_001';//商户门店编号,非必填
	$con = json_encode($content);//$content是biz_content的值,将之转化成字符串

	/*公共参数*/
	$param = array();
	$Client = new AopClient();//实例化支付宝sdk里面的AopClient类,下单时需要的操作,都在这个类里面
	$param['app_id'] = $alipay_config['app_id'];//支付宝分配给开发者的应用ID
	$param['method'] = $alipay_config['method'];//接口名称
	$param['charset'] = $alipay_config['charset'];//请求使用的编码格式
	$param['sign_type'] = $alipay_config['sign_type'];//商户生成签名字符串所使用的签名算法类型
	$param['timestamp'] = $alipay_config['timestamp'];//发送请求的时间
	$param['version'] = $alipay_config['version'];//调用的接口版本,固定为:1.0
	$param['notify_url'] =$alipay_config['notify_url'];//支付宝服务器主动通知地址
	$param['biz_content'] = $con;//业务请求参数的集合,长度不限,json格式

	/*签名*/
	$paramStr = $Client->getSignContent($param);//取得待签名字符串
	$sign = $Client->alonersaSign($paramStr,$alipay_config['rsaPrivateKey'],$alipay_config['sign_type']);//生成签名
	$param['sign'] = $sign;
	$str = $Client->getSignContentUrlencode($param);//所有待提交参数进行url编码
	return $str;

}

支付完成后,下面就是验证支付了

function alipay_notify(){
	require_once("alipay/aop/AopClient.php");
	$aop = new AopClient;
	$aop->alipayrsaPublicKey = $alipay_config['alipayrsaPublicKey'];//传入支付宝公钥参数

	$flag = $aop->rsaCheckV1($_POST, NULL, $alipay_config['sign_type']);//验签,保证签名方式于提交时一致

	if($flag){
		/*此处放更改订单状态等代码
		可以验证支付的商户订单号$_POST['out_trade_no'] 
		支付金额$_POST['total_amount']  
		订单支付状态$_POST['trade_status'](一般为TRADE_SUCCESS)
		*/

		echo 'success';//success和下方的fail,应答支付宝。必须保证本界面无错误。只打印了success,否则支付宝将重复请求回调地址。
	}else{
		
		echo "fail";
	}
}

至此,整个支付过程就算完成了。

最后,划一下重点:
1.使用SDK吊起支付宝APP支付,必须签约并开通APP支付权限。
2.验签时使用的是支付宝公钥,并非应用公钥。
3.biz_content一定要json_encode
4.支付金额要转为float型

0.00 星 (0 分) - 0 人投票

发表评论

电子邮件地址不会被公开。 必填项已用*标注