1、https://openhome.alipay.com/ 支付宝开放平台并创建应用,审核通过后并签约app支付拿到pid

2、按照官方文档用 【RSA签名验签工具.bat】生成应用公钥和私钥

3、下载支付宝官方demo(https://docs.open.alipay.com/54/106370/根据自己的开发语言下载)包整合到项目中(说实话这个php的demo着实有些坑)

整合好开始写支付宝支付类代码如下:

  1. <?php
  2. namespace data\extend;
  3. use data\extend\alipay_app\aop\AopClient;
  4. use data\extend\alipay_app\aop\request\AlipayTradeAppPayRequest as AlipayTradeAppPayRequest;
  5. /**
  6. * 功能说明:自定义支付宝支付接入类
  7. */
  8.  
  9. class AliPayApp {
  10.  
  11. protected $aop;
  12. /**
  13. * 初始化
  14. */
  15. public function __construct()
  16. {
  17. $this->aop = new AopClient();
  18. $this->aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
  19. $this->aop->appId = "步骤一中拿到的应用appid";
  20. $this->aop->rsaPrivateKey = "*******";//私有密钥(步骤二中生成的商户私有秘钥)
  21. $this->aop->format = "JSON";
  22. $this->aop->charset = "utf-8";
  23. $this->aop->signType = "RSA2";
  24. $this->aop->alipayrsaPublicKey = "****";//商户公钥(步骤二中生成的商户公钥)
  25. $this->aop->alipayPublicKey = "*****";//支付宝公钥
  26. }
  27.  
  28. /**
  29. * 创建APP支付订单
  30. *
  31. * @param string $body 对一笔交易的具体描述信息。
  32. * @param string $subject 商品的标题/交易标题/订单标题/订单关键字等。
  33. * @param string $order_sn 商户网站唯一订单号
  34. * @return array 返回订单信息
  35. */
  36. public function createAppPay($order_sn,$body, $subject, $total_amount)
  37. {
  38. //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
  39. $request = new AlipayTradeAppPayRequest();
  40. //SDK已经封装掉了公共参数,这里只需要传入业务参数
  41. $bizcontent = [
  42. 'body' => $body,
  43. 'subject' => $subject,
  44. 'out_trade_no' => $order_sn,
  45. 'timeout_express' => '1d',//失效时间为 1天
  46. 'total_amount' => $total_amount,//价格
  47. 'product_code' => 'QUICK_MSECURITY_PAY',
  48. ];
  49. //商户外网可以访问的异步地址 (异步回掉地址,根据自己需求写)
  50. $request->setNotifyUrl("http://".$_SERVER['HTTP_HOST']."/此处为回调通知地址");
  51. $request->setBizContent(json_encode($bizcontent));
  52. //这里和普通的接口调用不同,使用的是sdkExecute
  53. $response = $this->aop->sdkExecute($request);
  54. return $response;
  55. //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
  56. }
  57.  
  58. /**
  59. * 异步通知验签
  60. *
  61. * @param string $params 参数
  62. * @param string $signType 签名类型:默认RSA
  63. * @return bool 是否通过
  64. */
  65. public function rsaCheck($params, $signType)
  66. {
  67. return $this->aop->rsaCheckV1($params, NULL, $signType);
  68. }
  69.  
  70. }

 上面代码注意在调用 data\extend\alipay_app\aop\AopClient 这个类需要注意回调验签的过程调用 $this->aop->rsaCheckV1()这个类进行通知的sign和post回来的参数(此处需要主要验签过程按照官方要求去掉sign和sign_type后)重新组装+支付宝公钥($this->aop->alipayPublicKey切记不是应用公钥)代码稍作调整如下

  1. /** rsaCheckV1 & rsaCheckV2
  2. * 验证签名
  3. * 在使用本方法前,必须初始化AopClient且传入公钥参数。
  4. * 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。
  5. **/
  6. public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') {
  7. $sign = $params['sign'];
  8. $params['sign_type'] = null;
  9. $params['sign'] = null;
  10. return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);
  11. }
  12.  
  13.     function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {
  14.  
  15. if($this->checkEmpty($this->alipayPublicKey)){
  16.  
  17. $pubKey= $this->alipayrsaPublicKey;
  18. $res = "-----BEGIN PUBLIC KEY-----\n" .
  19. wordwrap($pubKey, 64, "\n", true) .
  20. "\n-----END PUBLIC KEY-----";
  21.     //logWrite("商户RSA公钥".$res);
  22. }else {
  23.   //读取公钥文件(注释部分为原来)
  24.            //$pubKey = file_get_contents($rsaPublicKeyFilePath);
  25.            //转换为openssl格式密钥
  26.            //$res = openssl_get_publickey($pubKey);
  27.  
  28.            //此处更改为支付宝公钥验签
  29.     $pubKey= $this->alipayPublicKey;
  30.     $res = "-----BEGIN PUBLIC KEY-----\n" .
  31.   wordwrap($pubKey, 64, "\n", true) .
  32.   "\n-----END PUBLIC KEY-----";
  33.     // logWrite("支付宝RSA公钥".$res);
  34. }
  35.  
  36. ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
  37.  
  38. //调用openssl内置方法验签,返回bool值
  39.      //logWrite("签名:".$sign);
  40. if ("RSA2" == $signType) {
  41. $result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
  42. } else {
  43. $result = (bool)openssl_verify($data, base64_decode($sign), $res);
  44. }
  45.  
  46. if(!$this->checkEmpty($this->alipayPublicKey) && is_file($this->alipayPublicKey)) {
  47. //释放资源
  48. openssl_free_key($res);
  49. }
  50.     //logWrite("验签结果:".var_export($result,true));
  51. return $result;
  52. }

至此基本大功告成,最后一步是APP端的调用代码如下:

  1. public function aliPayApp()
  2. {
  3. $out_trade_no = $this->GetReqArgc('out_trade_no');
  4. if (empty($out_trade_no)) {
  5. $this->error("没有获取到支付信息");
  6. }
  7. $data = $this->getPayInfo($out_trade_no);
  8. if($data < 0)
  9. {
  10. return $data;
  11. }
  12. $ali_pay = new AliPayApp();
  13. $retval = $ali_pay->createAppPay($out_trade_no, $data['pay_body'], $data['pay_detail'], $data['pay_money']);
  14. if($res){
  15. $this->ExitMessage(SUCCESS,"",array("out_trade_no"=>$out_trade_no,"retData"=>$res));
  16. }else{
  17. $this->ExitMessage(ERROR_CODE,"支付宝参数错误",0);
  18. }
  19.  
  20. }

 以上接口返回给APP端后唤起快捷SDK创建订单并支付的参数后即可调起支付宝APP进行支付操作,最后就是通知处理支付结果的业务逻辑如下代码:

  1. public function payCallback(){
  2. $request = input('post.');
  3. $pay = new AliPayApp();
  4. $verify = $pay->rsaCheck($params,$signType);
  5. if ($verify_result) { // 验证成功
  6. $out_trade_no = $request['out_trade_no'];
  7. // 支付宝交易号
  8. $trade_no = $request['trade_no'];
  9. // 交易状态
  10. $trade_status = $request['trade_status'];
  11. //logWrite("支付成功了");
  12. if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
  13.  
  14. //此处支付成功后的业务逻辑处理根据自己需求
  15.  
  16. echo "success"; // 请不要修改或删除
  17. }
  18. } else {
  19. // 验证失败
  20. echo "fail";
  21. }
  22. }

 ok大功告成!说实话支付宝支付还是比微信支付要好许多虽然也有坑,但微信支付的坑是比较多的! 

移动应用端的支付宝支付php开发流程的更多相关文章

  1. 微信支付与支付宝支付java开发注意事项

    说明:这里只涉及到微信支付和淘宝支付 以官网的接口为准,主要关注[网关].[接口].[参数][加密方式][签名][回调] 第一步,了解自己的项目要集成的支付方式 常见的有扫码支付.网页支付.APP支付 ...

  2. 客服端与服务端APP支付宝支付接口联调的那些坑

    根据支付宝官方提供的文档的建议: TIPS:这一步应在商户服务端完成,商户服务端直接将组装和签名后的请求串orderString传给客户端,客户端直接传给SDK发起请求.文档和Demo是为了示例效果在 ...

  3. IOS开发--支付宝支付

    前言:继上次<IOS开发--微信支付>以来,一直没有太多时间,更新总结详细支付这样的长篇大论,很抱歉.今天,推出支付宝支付的详细流程. 1.开始下载和查看支付宝支付的Demo. 我们直接进 ...

  4. 开发支付宝支付用DELPHI实现 RSA签名

    近来根据业务需求 在ERP中集成了微信支付,支付宝支付,开发支付宝支付时最大的障碍就是RSA签名,找了很多资料,最终用 下了个libeay32.pas  根据网上资料最终解决了问题 function  ...

  5. Luffy之支付宝支付开发API

    发起支付 接入支付宝 支付的大致流程如下图:                                                      部分节点详解: 沙箱环境 是支付宝提供给开发者的 ...

  6. MUI 支付宝支付接入

    沙箱测试地址:https://openhome.alipay.com/platform/appDaily.htm 1资源下载地址:https://docs.open.alipay.com/54/106 ...

  7. 李洪强iOS开发支付集成之支付宝支付

    iOS开发支付集成之支付宝支付 下载支付宝SDK 首先是开发包下载,还是比较难发现的,网上以前文章中的链接都打不开,我找了好久才找到的.最新的地址在这里(注意的是下载出来的SDK包里面并没有传说中的开 ...

  8. python 全栈开发,Day102(支付宝支付)

    昨日内容回顾 1. django请求生命周期? - 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者po ...

  9. Laravel 开发支付宝支付与提现转账问题小结

    由于项目需要,所以需要开发支付宝支付与微信支付,支付部分采用了 yansongda/pay    https://packagist.org/packages/yansongda/pay  https ...

随机推荐

  1. nginx中ngx_http_ssl_module模块

    此模块为HTTPS提供必要的⽀支持worker_processes auto;http {...server {listen 443 ssl;keepalive_timeout 70;ssl_prot ...

  2. [唐胡璐]Selenium技巧 - 定制元素属性检查,并写到ReportNG中

    QTP 和Selenium 都会有这种要检查某一个控件元素属性的情况,比如去检查一个Button的显示文字是什么? 为了更方便的书写程序,并优美的显示到HTML测试报告中,做了以下几个小小的封装,只是 ...

  3. CSS实现宽度自适应100%,宽高16:9的比例的圖片或者矩形

    前言 图片的大小是多少,宽度一定,高度要始终自自适应为16:9. 解决 1通过js,程序算出绝对高度再进行设置.这是解决问题最容易想到的方法. 2.我们的原则是能用css实现的功能尽量用css,这有利 ...

  4. GEF中TreeViewer的叶子节点展开

    /** * GEF树叶子节点的展开 * @param items */ private void expand(TreeItem[] items) { for (int i = 0; i < i ...

  5. mongodb中find $ne null 与$exists的区别

    $ne null 会把空列表也算入,即使不存在. $exists 的识别效果就比较好 1.插入样例数据 db.nullexistsdemo.insertMany( [{ "name" ...

  6. AtCoder Beginner Contest 148

    ABC 148 第一次打abc,记录一下 Task Name Time Limit Memory Limit A Round One 2 sec 1024 MB B Strings with the ...

  7. 为什么用到springboot?

  8. springboot2.0最精简的配置yml

    https://blog.csdn.net/yu_hongrun/article/details/81708762

  9. ueditor粘贴从word中copy的图片和文字 图片无法显示的问题

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

  10. 「CQOI2006」简单题 线段树

    「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...