您好,欢迎访问一九零五行业门户网

在服务端实现APP支付功能

这次给大家带来在服务端实现app支付功能,在服务端实现app支付功能的注意事项有哪些,下面就是实战案例,一起来看一下。
支付宝支付分为了很多种场景,这里只讲述支付宝app支付功能集成,期间遇到了特别大的坑,因此我简单描述下集成过程,并概述遇到的问题及解决方案
由于公司业务简单,只支持支付宝支付,而无需关心退款,查询等等额外功能,因此该篇内容仅仅讲述支付宝支付接口时服务端如何准备app拉取支付订单的信息,大概流程如下
一、创建应用及配置
首先,需要到蚂蚁金服开发平台(open.alipay.com)注册应用,并获取应用id,并配置应用,这里在配置时主要是签约,生成应用的rsa2公私钥,同时获取到支付宝提供的支付公钥等,这部分官网后台都有提示,比较简单
二、下载对应sdk
这里我是在php后台集成服务,因此下载的是php sdk,地址:https://docs.open.alipay.com/54/103419/
三、准备一个可以访问的真实域名
四、案例
当以上三部完成之后,此时就可以进入配置我们自己的业务代码了
4.1、组织app支付时的支付订单信息
<?php require_once (dir.'/alipay-sdk-php-20171023143822/aopsdk.php'); class alipay { /** * 应用id */ const appid = '你的应用id'; /** *请填写开发者私钥去头去尾去回车,一行字符串 */ const rsa_private_key = '应用对应开发者私钥'; /** *请填写支付宝公钥,一行字符串 */ const alipay_rsa_public_key = '支付宝提供的公钥'; /** * 支付宝服务器主动通知商户服务器里指定的页面 * @var string */ private $callback = "http://www.test.com/notify/alipay_notify.php"; /** *生成app支付订单信息 * @param string $orderid 商品订单id * @param string $subject 支付商品的标题 * @param string $body 支付商品描述 * @param float $pre_price 商品总支付金额 * @param int $expire 支付交易时间 * @return bool|string 返回支付宝签名后订单信息,否则返回false */ public function unifiedorder($orderid, $subject,$body,$pre_price,$expire){ try{ $aop = new \aopclient(); $aop->gatewayurl = https://openapi.alipay.com/gateway.do;   $aop->appid = self::appid;   $aop->rsaprivatekey = self::rsa_private_key;   $aop->format = json;   $aop->charset = utf-8;   $aop->signtype = rsa2;   $aop->alipayrsapublickey = self::alipay_rsa_public_key;   //实例化具体api对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay   $request = new \alipaytradeapppayrequest();   //sdk已经封装掉了公共参数,这里只需要传入业务参数   $bizcontent = {\body\:\{$body}\, //支付商品描述   . \subject\:\{$subject}\, //支付商品的标题   . \out_trade_no\:\{$orderid}\, //商户网站唯一订单号   . \timeout_express\:\{$expire}m\, //该笔订单允许的最晚付款时间,逾期将关闭交易   . \total_amount\:\{$pre_price}\, //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]   . \product_code\:\quick_msecurity_pay\   . };   $request->setnotifyurl($this->callback);   $request->setbizcontent($bizcontent);   //这里和普通的接口调用不同,使用的是sdkexecute   $response = $aop->sdkexecute($request);   //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题   return htmlspecialchars($response);//就是orderstring 可以直接给客户端请求,无需再做处理。  }catch (\exception $e){   return false;  }  } }
4.2、支付宝支付成功之后异步回调处理
<?php /** * alipay_notify.php. * user: lvfk * date: 2017/10/26 0026 * time: 13:48 * desc: 支付宝支付成功异步通知 */ include_once (dir.'/../alipay-sdk-php-20171023143822/aopsdk.php'); //验证签名 $aop = new \aopclient(); $aop->alipayrsapublickey = \comm\pay\alipay::alipay_rsa_public_key; $flag = $aop->rsacheckv1($_post, null, rsa2); //验签 if($flag){  //处理业务,并从$_post中提取需要的参数内容  if($_post['trade_status'] == 'trade_success'  || $_post['trade_status'] == 'trade_finished'){//处理交易完成或者支付成功的通知  //获取订单号  $orderid = $_post['out_trade_no'];  //交易号  $trade_no = $_post['trade_no'];  //订单支付时间  $gmt_payment = $_post['gmt_payment'];  //转换为时间戳  $gtime = strtotime($gmt_payment);  //此处编写回调处理逻辑 //处理成功一定要返回 success 这7个字符组成的字符串, //die('success');//响应success表示业务处理成功,告知支付宝无需在异步通知    } }
五、遇到的问题
5.1、一直报错40001=>isv.invalid-signature
为了搞清楚原因,先后多次重新生成应用的rsa2公私密钥,发现都没有作用。最后结合网上资料,才发现,原来是支付宝回调地址notifyurl不能有 '?' 以及 ?后面加参数
5.2、支付宝异步通知成功了,但是$_post为空
这个也花费了一点时间查找,开始做的时候就是遵照支付宝的建议使用htts方式请求。但这样应用后台一直通知没有参数内容。最后才想起来由于我们的应用使用了htts双向认证,这个原因导致支付宝的服务器回调的参数为空。最后,把回调地址改为了http方式,验证通过
通过遇到的问题,首先查看支付宝的文档描述以及支付宝提供的错误码解释,实在不行就百度或者谷歌,再加上自己不断测试验证,最终一定可以解决问题
至此,支付宝app支付这块功能完成,其他的app退款、对账单等等功能就没继续做,不过按照支付宝官网文档以及支付宝提供的sdk,集成到自己应用也只是时间问题。
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
php回调函数及匿名函数使用详解
phpstudy2018的访问目录服务权限
thinkphp实现微信支付(jsapi支付)流程教程详解_php实例
以上就是在服务端实现app支付功能的详细内容。
其它类似信息

推荐信息