多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# alipay 服务器端 > 这里分享一下服务端配置alipay的过程 **核心文件下载地址:** http://pan.baidu.com/s/1qYS8uDm 新版的支付宝 进入支付宝中,点击签约管理 ![](https://box.kancloud.cn/f716ad305ab6c47aafa285e16b7d6fdb_1423x762.png) ![](https://box.kancloud.cn/120fb445fffa3246bb790ea9c2f58041_898x349.png) ![](https://box.kancloud.cn/1cbf7f3387539d8ec54b935e22436c76_992x352.png) ## *这里配置公钥和私钥请参考客户端中的秘钥配置** ## **php端** > 先将所需文件放到项目中,如图 ![](https://box.kancloud.cn/21d88ce98376157593dca4ef48e91c47_544x895.png) > 在config中配置需要的信息 **注:cacert 这一项必须引入,注意路径,全部的配置项都按图所示** ![](https://box.kancloud.cn/8d09ebcb30d2965c0f40070ae178caf6_1840x716.png) 代码如下 ~~~ $configs = array( "EXTEND_PATH" => '.'.__ROOT__.'/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()."__ROOT__/extend/Alipay/cacert.pem", 'transport'=>'http', ), ); return $configs; ~~~ > alipay中,需要将orderInfo的信息在服务器端拼接处理 ![](https://box.kancloud.cn/1655561f6bfb394795249c1dd8891fbd_1461x267.png) > 现在附上我在服务器端处理信息的代码--按需修改数据处理和字段名其余的地方不要动 ~~~ /** * 支付前调用 * 所有的数据都在服务端进行组合,最后返回给客户端一个处理后的字符串。 */ 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格式 必须是 下图 而且必须是外网地址。** ![](https://box.kancloud.cn/6e567dded7d0f26956343b0c8da5920f_547x37.png) > 要使用支付宝公钥,不要弄成应用公钥 ![](https://box.kancloud.cn/6b448a6465b0917b03af242f7bad70d8_1271x121.png) > 回调文件 ![](https://box.kancloud.cn/1d817725696c73c69e1bd0c4ff7ec86c_361x659.png) 代码如下 > 验证回调的时候,推荐使用php中的log类 打印日志,在失败的时候方便查找问题,我在这里卡了很久 **下图中的核心文件请到支付宝下载sdk** ![](image/screenshot_1492504810951.png) **回调文件代码** ~~~ <?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())."\n".$sql."\n"); 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())."\n".'失败'."\n"); flock($fp, LOCK_UN); fclose($fp); echo "sign fail"; } ?> ~~~