资讯专栏INFORMATION COLUMN

TP5实现支付宝app支付

Pandaaa / 2659人阅读

摘要:因公司业务需要需要给客户接入支付宝支付自己以前只做过网页版支付宝支付。添加功能完后我的应用列表就会显示添加的应用,即支付宝支付。最后别忘了在异步方法返回一个,否则支付宝会以为没支付成功,小时内每个几分钟就调一次异步接口。

因公司业务需要,需要给客户接入支付宝支付,自己以前只做过网页版支付宝支付。折腾了3天,踩了很多坑,终于搞定了,现在记录一下,分享给大家.
一、首先必须通知客户先申请支付宝商家账号,然后认证。当然这是废话...没有账号还支付个毛线...
然后让客户登陆支付宝账号后,右上角有个开放平台,点开.

点开之后是这个样子.

这里都是需要客户操作的,客户点击支付接入后,会有个认证签约页面,签约完之后,会生成应用唯一标识(APPID)。应用创建完成后,系统会自动跳转到应用详情页面。然后可以点击 添加功能 来添加App支付功能。添加功能完后,我的应用列表就会显示添加的应用,即支付宝App支付。因为我的是个人号,所以没法演示。这一部我们只需要等待客户申请就好,什么也不用做。详细流程参加支付宝官方文档:https://docs.open.alipay.com/... 这里面唯一需要开发者做的就是生成密钥这一步。

点击红线部分快速签名教程就可以跳转到签名工具页面,

点击下载,我是windows环境,下载完成后,打开工具。我是php开发,所以选非JAVA适用,点击生成密钥就会出现两大坨,一个是商户私钥一个是商户公钥(就是开发者私钥公钥).然后右下角有个上传公钥按钮,点击会跳转到支付宝开放平台页面。

因为我不是商家,无法认证,所以这是空白的。如果是商家账号,就会显示类似于这个页面:

点击RSA设置,填上 开发者公钥私钥,就会生成一个新的支付宝公钥。到此一步,申请的部分完成。

下面是开发者后台接入的部分

在开始后台代码前,我们必须有3个参数,开发者私钥、支付宝公钥、APPID。 这里的开发者私钥也叫应用私钥,一个意思,不要绕晕了。
没有这3个参数,就没法唤起支付宝支付接口!!!
准备好后可以下载支付宝的官方demo代码参考。demo在这个页面下载:https://docs.open.alipay.com/...
打开是酱紫:

我自己用TP5封装了一个方法,童鞋可以参考下:

namespace appapicontroller;
use appcommoncontrollerRootsApi;
use thinkDb;
require_once EXTEND_PATH . "/alipay/AopSdk.php";

/**

支付宝

*/
class Alipay extends RootsApi
{

//应用APPID,都是2019开头
const APPID = "2019*";
//开发者私钥去头去尾去回车,一行字符串
const RSA_PRIVATE_KEY = "";
//支付宝公钥(上传开发者公钥(又叫应用公钥)后才能生成)
const ALIPAY_RSA_PUBLIC_KEY = "";

public function _initialize()
{

 parent::_initialize();
 

}

/**
*支付方法,调用支付宝接口成功后,会返回给前端一个长串的参数字符串。前端利用它唤起支付宝
*/
public function paytoOffi()
{

 try {
 //调支付宝接口(这里写死测试,实际按逻辑来)
 $res = $this->getAlipayMsg("买单","消费者买单",2342424214234,0.01);

 return json_encode($res);//必须是json格式
   
 } catch (Exception $e) {
      return false;
 }

}

/**

用户消费异步通知服务器方法

@return void

*/
public function notify()
{
$arr = $_POST;
file_put_contents("d.txt",json_encode($arr),FILE_APPEND);//写入txt支付宝的返回数据
//验证签名
$aop = new AopClient();
$aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;

$flag = $aop->rsaCheckV1($arr, null, "RSA2");
if ($flag) {

//验签
//处理业务,并从$arr中提取需要的参数内容
if ($arr["trade_status"] == "TRADE_SUCCESS"
|| $arr["trade_status"] == "TRADE_FINISHED") { //处理交易完成或者支付成功的通知
    //自己的业务逻辑,比如修改订单为已支付
 
  die("success");
  //必须有这句,echo "success"也可以,否则支付宝会以为支付没成功,而在一天内连续调用异步接口,容易出错  
}

}

}

/**

调用支付宝接口方法

@param $body 订单描述

@param $subject 订单标题

@param $out_trade_no 订单号

@param string $amount 价格

@return array 支付宝返回信息

*/
private function getAlipayMsg($body, $subject, $out_trade_no, $amount)
{

 $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":"{$out_trade_no}","//商户网站唯一订单号
. ""timeout_express":"60m","//该笔订单允许的最晚付款时间,逾期将关闭交易
. ""total_amount":"{$amount}","//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
. ""product_code":"QUICK_MSECURITY_PAY""
. "}";
 
 $request->setNotifyUrl("http:xxxxx.com/api/alipay/notify");//你自己的异步地址,必须写全,而且不能有参数 
 $request->setBizContent($bizcontent);
 //这里和普通的接口调用不同,使用的是sdkExecute
 $response = $aop->sdkExecute($request);
 $result = array("order_str"=> $response);

 return $result;

}

}

首先前台调支付接口paytoOffi,然后这个方法就会调getAlipayMsg方法,即调支付宝接口的方法,这4个参数描述、标题、订单号、价格后3个是必填的。描述可以不填,这个酌情修改。然后调接口,支付宝会返回请求字符串,即唤起支付宝软件的一长串字符串,这里有个大坑,官方文档上说直接echo 给前台就行,但其实应该转成json格式返给前台,否则会报100XX错误,即参数格式不正确。下面是官方的坑教程截图:

每次看见这句不需要再做处理我就来气...当时坑了我两天,就是没想起来要转JSON格式返回。我这里是把返回的字符串放进一个数组,然后再json_encode返回。返回的字符串如果在页面上打印是这个样子的

我没有截全,很长一大串。(前端要去掉order_str的键名,取键值)
前端拿着这串东西就可以唤起支付宝软件,进行支付,支付成功后,你写的支付宝异步回调函数就会收到一串信息,notify方法的$_POST就有数据了。可以转成JSON格式打印出来:
{

"gmt_create": "2019-06-24 17:16:03",
"charset": "UTF-8",
"seller_email": "********",
"subject": "u4e70u5355",
"sign": "***********",
"body": "u6d88u8d39u8005u4e70u5355",
"buyer_id": "*******",
"invoice_amount": "0.01",
"notify_id": "**********",
"fund_bill_list": "*********",
"notify_type": "trade_status_sync",
"trade_status": "TRADE_SUCCESS",//交易状态,success为支付成功
"receipt_amount": "0.01",
"app_id": "*******",
"buyer_pay_amount": "0.01",
"sign_type": "RSA2",
"seller_id": "",
"gmt_payment": "2019-06-24 17:16:03",
"notify_time": "2019-06-24 17:19:10",
"version": "1.0",
"out_trade_no": "1624677580792188",//你自己的订单号
"total_amount": "0.01",//支付总金额
"trade_no": "************",//支付宝流水号
"auth_app_id":"***********",
"buyer_logon_id": "",//买家的支付宝账号
"point_amount": "0.00"

}

星号部分都是有值的。
只要trade_status的值是success就是支付成功

取出里面的订单号 价格之类的就可以写业务逻辑了,具体看https://docs.open.alipay.com/... 参数说明。最后别忘了在异步方法返回一个"SUCCESS",否则支付宝会以为没支付成功,24小时内每个10几分钟就调一次异步接口。

至此,整个支付流程就走完了,支付宝虽然有点坑,但是比微信支付强多了,微信的文档才是真的坑!欢迎童鞋们参考。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76111.html

相关文章

  • TP5实现支付app支付

    摘要:因公司业务需要需要给客户接入支付宝支付自己以前只做过网页版支付宝支付。添加功能完后我的应用列表就会显示添加的应用,即支付宝支付。最后别忘了在异步方法返回一个,否则支付宝会以为没支付成功,小时内每个几分钟就调一次异步接口。 因公司业务需要,需要给客户接入支付宝支付,自己以前只做过网页版支付宝支付。折腾了3天,踩了很多坑,终于搞定了,现在记录一下,分享给大家.一、首先必须通知客户先申请支付...

    Dionysus_go 评论0 收藏0
  • TP5实现支付电脑网站支付学习笔记

    摘要:第一次做支付宝的支付,踩了点小坑,还算顺利。第一步当然是在支付宝开放平台申请公钥私钥等,支付宝关官方文档都有详细介绍,这里就省略。就是那个支付宝二维码的页面。支付宝支付成功后会执行这两个方法,系统会把你支付的信息用方式异步传给你的方法。 这两天在公司做一个小型WEB项目,需要有支付功能。第一次做支付宝的支付,踩了点小坑,还算顺利。激动的我赶紧记下实现的流程。第一步当然是在支付宝开放平台...

    TNFE 评论0 收藏0
  • Andriod监听支付收款实现个人支付支付接口!附安卓App

    摘要:界面界面就这点东西了只需要设置后端接口就可以接收这个监听的支付宝收款数据了会以方式向您的接口一段数据数据格式如下支付宝支付成功收款元。 个人微信支付宝免签约支付解决方案 https://www.likeyunba.com/pay/ 首先呢,我不会开发安卓App,这款APP是我在酷安网看到的,非常简单的一款APP,安装后填写我们的后端接口(用于接收收款通知的)就可以接收收款通知了。所以就...

    ZoomQuiet 评论0 收藏0
  • 支付开发填坑记之支付

    摘要:原文地址支付支付步骤为获取支付宝的配置信息。将得到的数据请求支付宝客户端进行支付。端将拼接好的字符串拿去请求支付宝客户端即可调起支付宝进行支付。向支付宝申请新订单,获取支付。成功请求回来后,就可以向支付宝发出一次支付请求。 支付宝在所有支付方式中最好开发的了,因为文档比较清晰,而且开发起来也比较简单。因此,支付宝的坑是相对较少的。原文地址 APP支付 APP支付步骤为: 获取支付宝的...

    chanjarster 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<