热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用PHP实现手机端APP支付宝的支付功能

最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,感兴趣的朋友一起看看吧最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝

最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,感兴趣的朋友一起看看吧

最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步:

1.在蚂蚁金服开放平台创建应用,签约商户,生成应用公钥和私钥;

2.配置统一下单支付参数;

3.整合支付宝demo类文件;

4.创建Alipay支付类,类内创建两个方法(alipay_app:统一下单方法和alipay_notify:支付成功异步回调方法);

第一步主要是在蚂蚁金服开放平台登录你的支付宝账号,接入支付功能,个人就选个人,服务商就选服务商,需要填写一些材料,如手机号,邮箱等,完成后就可以创建应用啦,创建应用完成后需要进行签约,只有签约之后你应用里面开放的支付功能才会生效,签约也需要填一堆信息,签约需要审核,成功后你会拿到一个2088开头partner值,这个第三步配置参数的时候需要用到,之后还要为你的应用生成公钥和私钥,这点在开放平台开发文档中有详细描述,下载生成秘钥工具,选择对应的秘钥类型,秘钥和公钥一定要保存好,这里就不多做赘述啦,到此开放平台的准备工作就结束了。

第二步就是整合支付宝demo文件了,我这里已经整合好了,直接把代码复制到两个文件中就可以了,一个为支付类,一个为通知类:

/*此为支付类*/class AlipayApp{ /**  * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串  * @param $para 需要拼接的数组  * return 拼接完成以后的字符串  */ function createLinkstring($para,$showQuotes = false) {  // $arg = "";  // while (list ($key, $val) = each ($para)) {  // $arg.=$key."=".$val."&";  // }  ////去掉最后一个&字符  // $arg = substr($arg,0,count($arg)-2);  ////如果存在转义字符,那么去掉转义  // if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}  // return $arg;  $arg = "";  $quotes = '';  if($showQuotes){   $quotes = '"';  }  foreach ($para as $key => $val) {   if($arg == ''){    $arg = $key.'='.$quotes.$val.$quotes;   }else{    $arg = $arg.'&'.$key.'='.$quotes.$val.$quotes;   }  }  if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}  return $arg; } /**  * 对数组排序  * @param $para 排序前的数组  * return 排序后的数组  */ function argSort($para) {  ksort($para);  reset($para);  return $para; } /**  * 除去数组中的空值和签名参数  * @param $para 签名参数组  * return 去掉空值与签名参数后的新签名参数组  */ function paraFilter($para) {  $para_filter = array();  while (list ($key, $val) = each ($para)) {   if($key == "sign" || $key == "sign_type" || $val == "")continue;   else$para_filter[$key] = $para[$key];  }  return $para_filter; } function query_timestamp() {  $url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->alipay_config['partner']))."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));  $encrypt_key = "";  $doc = new DOMDocument();  $doc->load($url);  $itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );  $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;  return $encrypt_key; } /**  * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)  * 注意:服务器需要开通fopen配置  * @param $word 要写入日志里的文本内容 默认值:空值  */ function logResult($word='') {  date_default_timezone_set("PRC");  $fp = fopen("log.txt","a");  flock($fp, LOCK_EX) ;  fwrite($fp,"执行日期:".strftime("%Y%m%d%H%M%S",time())."\n".$word."\n");  flock($fp, LOCK_UN);  fclose($fp); } /**  * 远程获取数据,POST模式  * 注意:  * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了  * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'  * @param $url 指定URL完整路径地址  * @param $cacert_url 指定当前工作目录绝对路径  * @param $para 请求的数据  * @param $input_charset 编码格式。默认值:空值  * return 远程输出的数据  */ function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') {  if (trim($input_charset) != '') {   $url = $url."_input_charset=".$input_charset;  }  $curl = curl_init($url);  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证  curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址  curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头  curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果  curl_setopt($curl,CURLOPT_POST,true); // post传输数据  curl_setopt($curl,CURLOPT_POSTFIELDS,$para);// post传输数据  $respOnseText= curl_exec($curl);  //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容  curl_close($curl);  return $responseText; } /**  * 远程获取数据,GET模式  * 注意:  * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了  * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'  * @param $url 指定URL完整路径地址  * @param $cacert_url 指定当前工作目录绝对路径  * return 远程输出的数据  */ function getHttpResponseGET($url,$cacert_url) {  $curl = curl_init($url);  curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头  curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证  curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址  $respOnseText= curl_exec($curl);  //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容  curl_close($curl);  return $responseText; } /**  * 实现多种字符编码方式  * @param $input 需要编码的字符串  * @param $_output_charset 输出的编码格式  * @param $_input_charset 输入的编码格式  * return 编码后的字符串  */ function charsetEncode($input,$_output_charset ,$_input_charset) {  $output = "";  if(!isset($_output_charset) )$_output_charset = $_input_charset;  if($_input_charset == $_output_charset || $input ==null ) {   $output = $input;  } elseif (function_exists("mb_convert_encoding")) {   $output = mb_convert_encoding($input,$_output_charset,$_input_charset);  } elseif(function_exists("iconv")) {   $output = iconv($_input_charset,$_output_charset,$input);  } else die("sorry, you have no libs support for charset change.");  return $output; } /**  * 实现多种字符解码方式  * @param $input 需要解码的字符串  * @param $_output_charset 输出的解码格式  * @param $_input_charset 输入的解码格式  * return 解码后的字符串  */ function charsetDecode($input,$_input_charset ,$_output_charset) {  $output = "";  if(!isset($_input_charset) )$_input_charset = $_input_charset ;  if($_input_charset == $_output_charset || $input ==null ) {   $output = $input;  } elseif (function_exists("mb_convert_encoding")) {   $output = mb_convert_encoding($input,$_output_charset,$_input_charset);  } elseif(function_exists("iconv")) {   $output = iconv($_input_charset,$_output_charset,$input);  } else die("sorry, you have no libs support for charset changes.");  return $output; } /**  * RSA签名  * @param $data 待签名数据  * @param $private_key 商户私钥字符串  * return 签名结果  */ function rsaSign($data, $private_key) {  //以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。  $private_key=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$private_key);  $private_key=str_replace("-----END RSA PRIVATE KEY-----","",$private_key);  $private_key=str_replace("\n","",$pr本2文来*源gao([email protected]@#码(网搞gaodaima代码ivate_key);  $private_key="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($private_key, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";  $res=openssl_get_privatekey($private_key);  if($res)  {   openssl_sign($data, $sign,$res);  }  else {   echo "您的私钥格式不正确!"."
"."The format of your private_key is incorrect!"; exit(); } openssl_free_key($res); //base64编码 $sign = base64_encode($sign); return $sign; } /** * RSA验签 * @param $data 待签名数据 * @param $alipay_public_key 支付宝的公钥字符串 * @param $sign 要校对的的签名结果 * return 验证结果 */ function rsaVerify($data, $alipay_public_key, $sign) { //以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。 $alipay_public_key=str_replace("-----BEGIN PUBLIC KEY-----","",$alipay_public_key); $alipay_public_key=str_replace("-----END PUBLIC KEY-----","",$alipay_public_key); $alipay_public_key=str_replace("\n","",$alipay_public_key); $alipay_public_key='-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($alipay_public_key, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----'; $res=openssl_get_publickey($alipay_public_key); if($res) { $result = (bool)openssl_verify($data, base64_decode($sign), $res); } else { echo "您的支付宝公钥格式不正确!"."
"."The format of your alipay_public_key is incorrect!"; exit(); } openssl_free_key($res); return $result; }}  /* * * 类名:AlipayNotify * 功能:支付宝通知处理类 * 详细:处理支付宝各接口通知返回 * 版本:1.0 * 日期:2016-06-06 * 说明: * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考 *************************注意************************* * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常 */class AlipayNotify { /** * HTTPS形式消息验证地址 */ var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&'; /** * HTTP形式消息验证地址 */ var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?'; var $alipay_config; function __construct($alipay_config){ $this->alipay_cOnfig= $alipay_config; } function AlipayNotify($alipay_config) { $this->__construct($alipay_config); } /** * 获取返回时的签名验证结果 * @param $para_temp 通知返回来的参数数组 * @param $sign 返回的签名结果 * @return 签名验证结果 */ function getSignVeryfy($para_temp, $sign) { $alipayapp = new \Alipayapp(); //除去待签名参数数组中的空值和签名参数 $para_filter = $alipayapp->paraFilter($para_temp); //对待签名参数数组排序 $para_sort = $alipayapp->argSort($para_filter); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 $prestr = $alipayapp->createLinkstring($para_sort); $isSgin = false; switch (strtoupper(trim($this->alipay_config['sign_type']))) { case "RSA" : $isSgin = $alipayapp->rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign); break; default : $isSgin = false; } return $isSgin; } /** * 获取远程服务器ATN结果,验证返回URL * @param $notify_id 通知校验ID * @return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ function getResponse($notify_id) { $alipayapp = new \Alipayapp(); $transport = strtolower(trim($this->alipay_config['transport'])); $partner = trim($this->alipay_config['partner']); $veryfy_url = ''; if($transport == 'https') { $veryfy_url = $this->https_verify_url; } else { $veryfy_url = $this->http_verify_url; } $veryfy_url = $veryfy_url."partner=" . $partner . "¬ify_id=" . $notify_id; $respOnseTxt= $alipayapp->getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']); return $responseTxt; }}


推荐阅读
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
author-avatar
手机用户40405729304
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有