当前位置: 首页 > 后端技术 > PHP

TP5实现支付宝app支付

时间:2023-03-29 14:59:58 PHP

因公司业务需要,需要为客户提供支付宝支付接入。我之前只做过网页版支付宝支付。折腾了3天,踩了很多坑,终于搞定了。现记录下来,分享给大家。1、首先,您必须通知客户先申请支付宝商户账户,然后进行身份验证。当然这是废话。。。买羊毛没有账户。。。然后让客户登录支付宝账户,右上角有个开放平台,点进去。点开之后是这个样子的。这里都是需要客户操作的东西,客户点击支付接入后,会出现一个鉴权签名页面。签名完成后,将生成一个应用程序唯一标识符(APPID)。创建应用后,系统会自动跳转到应用详情页面。然后可以点击添加功能添加App支付功能。添加该功能后,添加的应用会显示在我的应用列表中,即支付宝应用支付。因为我的账户是个人的,所以我无法证明。对于这个,我们只需要等待客户申请,什么都不用做。详细过程请参考支付宝官方文档:https://docs.open.alipay.com/...开发者在这里唯一需要做的就是生成密钥。点击快速签名教程红线部分跳转到签名工具页面,点击下载,我是windows环境,下载完成后,打开工具。我是php开发者,所以如果选择非JAVA申请,点击GenerateKey,会出现两个大疙瘩,一个是商家的私钥,一个是商家的公钥(也就是开发商的私钥和公钥)钥匙)。然后右下角按钮有个上传公钥,点击跳转到支付宝开放平台页面。这是空白,因为我不是商家,无法进行身份验证。如果是商户账户,会显示类似这样的页面:点击RSA设置,填写开发者公钥和私钥,会生成一个新的支付宝公钥。至此,应用部分就完成了。以下是开发者后台接入的部分:在启动后台代码之前,我们必须要有3个参数,开发者私钥,支付宝公钥,APPID。这里的开发者私钥也叫应用私钥,意思是别搞混了。没有这3个参数,是无法调用支付宝支付接口的!准备好后可以下载支付宝官方demo代码参考。demo在这个页面下载:https://docs.open.alipay.com/...打开就是酱子:我用TP5封装了一个方法,童鞋们可以参考:getAlipayMsg('pay','消费支付',2342424214234,0.01);returnjson_encode($res);//必须是json格式}catch(\Exception$e){returnfalse;}}/**用户消费异步通知服务器方法@returnvoid*/publicfunctionnotify(){$arr=$_POST;file_put_contents('d.txt',json_encode($arr),FILE_APPEND);//写入txt的返回数据支付宝//校验签名$aop=newAopClient();$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订单号@paramstring$amount价格@returnarray支付宝返回信息*/privatefunctiongetAlipayMsg($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对应的请求类,类名对应接口名,当前调用接口名: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个参数description,title,ordernumber,price的最后3个是必要的。描述可以留空,这个可以酌情修改。然后调整界面,支付宝会返回请求字符串,也就是一长串唤起支付宝软件的字符串。这里有个大坑。官方文档说直接回显给前台就可以了,但实际上应该是转成json格式返回给前台,否则会报100XX错误,也就是参数格式不对。下面是官方的坑教程截图:每次看到这句话,我都不用再做处理了,气死我了。。。当时被骗了两天,但是我没有没想过转成JSON格式再返回。这里我把返回的字符串放到一个数组中,然后用json_encode返回。如果返回的字符串是这样打印在页面上的,我没有把它完全切掉,它是一个很长的字符串。(前端需要删除order_str的键名,得到键值)前端可以拿着这串东西来唤起支付宝软件进行支付。支付成功后,你写的支付宝异步回调函数会收到一堆信息。通知方法$_POST有数据。可以转成json格式打印出来:{"gmt_create":"2019-06-2417:16:03","charset":"UTF-8","seller_email":"********","主题":"\u4e70\u5355","符号":"************","正文":"\u6d88\u8d39\u8005\u4e70\u5355",“buyer_id”:“*******”,“invoice_amount”:“0.01”,“notify_id”:“************”,“fund_bill_list”:“********","notify_type":"trade_status_sync","trade_status":"TRADE_SUCCESS",//交易状态,成功表示支付成功"receipt_amount":"0.01","app_id":"********","buyer_pay_amount":"0.01","sign_type":"RSA2","seller_id":"","gmt_payment":"2019-06-2417:16:03","notify_time":"2019-06-2417: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分钟调整一次异步接口。至此,整个支付流程结束。支付宝虽然有点坑爹,但比微信支付好太多了,微信的证件才是真坑爹的!欢迎童鞋参考。