牛骨文教育服务平台(让学习变的简单)

alipay 服务器端

这里分享一下服务端配置alipay的过程

核心文件下载地址: http://pan.baidu.com/s/1qYS8uDm

新版的支付宝
进入支付宝中,点击签约管理


这里配置公钥和私钥请参考客户端中的秘钥配置*

php端

先将所需文件放到项目中,如图

在config中配置需要的信息
注:cacert 这一项必须引入,注意路径,全部的配置项都按图所示

代码如下

$configs = array(
	"EXTEND_PATH" => ".".."/extend/",
	"alipay_config" =>array(
		//商户的私钥,此处填写原始私钥去头去尾,RSA公私钥生成
		"private_key"=>"",
		//支付宝的公钥
		"alipay_public_key"=>"",
		"service"=>"mobile.securitypay.pay",//接口名称
		"partner"=>"2088621673597664",
		"input_charset"=>strtolower("UTF-8"),
		"notify_url"=>"http://***/notify_url.php",
		"payment_type"=>1,
		"seller_id"=>"****.com",
		"sign_type"=>strtoupper("RSA"),
		"cacert"=>getcwd()."/extend/Alipay/cacert.pem",
		"transport"=>"http",
	),
);
return $configs;

alipay中,需要将orderInfo的信息在服务器端拼接处理

现在附上我在服务器端处理信息的代码--按需修改数据处理和字段名其余的地方不要动

/**
	 * 支付前调用
	 * 所有的数据都在服务端进行组合,最后返回给客户端一个处理后的字符串。
	 */
	function  alipay_before(){
		require_once C(EXTEND_PATH)."Alipay/alipaycore.php";
		require_once C(EXTEND_PATH)."Alipay/alipayrsa.php";
		$order_id = I("orderID");
		if(!$order_id){
			$arr["msg"] = "非法数据";
			$this->output($arr);
			exit;
		}
		$order_info = $this->payment_history_model->find($order_id);
		switch($order_info["classification_id"]){
			case "1":
				$subject = "VIP咨询师";
				break;
			case "2":
				$subject = "超级VIP咨询师";
				break;
		}
		//建立请求
		$out_trade_no = $order_info["order_number"]; //订单号
		$total_fee = $order_info["money"];   //付款金额
		$body = "成为会员";  //商品详情
		$alipay_config = C("alipay_config");
		//构造要请求的参数数组,无需改动
		$parameter = array(
			"partner"=>$alipay_config["partner"],//合作者身份ID
			"seller_id"=>$alipay_config["seller_id"],
			"out_trade_no"=>$out_trade_no,//商户网站唯一订单号
			"subject"=>$subject,//商品名称
			"body"=>$body,//商品详情
			"total_fee"=>$total_fee,
			"notify_url"=>$alipay_config["notify_url"],//服务器异步通知页面路径
			"service"=>$alipay_config["service"],//接口名称
			"payment_type"=>$alipay_config["payment_type"],//支付类型
			"_input_charset"=>$alipay_config["input_charset"],//参数编码字符集
		);
		//将post接收到的数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串。
		$data = createLinkstring($parameter);
		//将待签名字符串使用私钥签名,且做urlencode. 注意:请求到支付宝只需要做一次urlencode.
		$rsa_sign = urlencode(rsaSign($data, $alipay_config["private_key"]));
		//把签名得到的sign和签名类型sign_type拼接在待签名字符串后面。
		$data = $data."&sign=".""".$rsa_sign."""."&sign_type=".""".$alipay_config["sign_type"].""";
		//打印待签名字符串。工程目录下的log文件夹中的log.txt。
//		logResult($data);
		//返回给客户端,建议在客户端使用私钥对应的公钥做一次验签,保证不是他人传输。
		$arr["orderInfo"] = $data;
		$this->output($arr);
	}

将拼接的信息用户客户端app测试看是否成功


注:回调地址不可以写mvc格式 必须是 下图 而且必须是外网地址。

要使用支付宝公钥,不要弄成应用公钥

回调文件

代码如下

验证回调的时候,推荐使用php中的log类 打印日志,在失败的时候方便查找问题,我在这里卡了很久

下图中的核心文件请到支付宝下载sdk

回调文件代码

<?php


/* *
 * 功能:支付宝服务器异步通知页面
 * 版本:1.0
 * 日期:2016-06-06
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。


 *************************页面功能说明*************************
 * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
 */
require_once("../../extend/Alipay/AopClient.php");
$aop = new AopClient;
$aop->alipayrsaPublicKey = "****支付宝公钥****";
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA");

if($flag){
	//商户订单号
	$out_trade_no = $_POST["out_trade_no"];

	//支付宝交易号
	$trade_no = $_POST["trade_no"];

	//交易状态
	$trade_status = $_POST["trade_status"];

	if($_POST["trade_status"] == "TRADE_FINISHED") {
		
	} else if ($_POST["trade_status"] == "TRADE_SUCCESS") {
		$pdo = new PDO("mysql:host=***数据库地址***;dbname=***数据库名称**","root","**密码**");
		$sql="update lt_payment_history set payorder=$trade_no where order_number = $out_trade_no";

		date_default_timezone_set("PRC");
		$fp = fopen("../../data/runtime/Logs/ccc.txt","a");
		flock($fp, LOCK_EX) ;
		fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."
".$sql."
");
		flock($fp, LOCK_UN);
		fclose($fp);

		$res=$pdo->exec($sql);
	}
	echo "success";		//请不要修改或删除
} else {
	date_default_timezone_set("PRC");
	$fp = fopen("../../data/runtime/Logs/bbb.txt","a");
	flock($fp, LOCK_EX) ;
	fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."
"."失败"."
");
	flock($fp, LOCK_UN);
	fclose($fp);

	echo "sign fail";
}

?>