热门标签 | 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; }}


推荐阅读
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
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社区 版权所有