目录
ping++
支付宝SDK
吐槽
首页 后端开发 php教程 【PHP后台】接入支付宝

【PHP后台】接入支付宝

Jun 23, 2016 pm 01:15 PM

  我使用PHP主要是为客户端做后台使用,并不会做前端网页。    这两天因为公司项目需要,必须接入支付功能,而支付宝当然首当其冲,考虑迭代版本的需要,首先接入支付宝功能,其他的支付功能以后迭代版本的时候加入。  但是就是这么一个支付功能几乎把我整的欲仙欲死~

  首先理一下逻辑

1.服务端生成订单签名;2.客户端(iOS/Android)根据订单签名,调用支付宝支付;3.支付宝回调我们的后台,支付完成;4.后台收到支付宝的通知,验证这个通知;5.验证通过,更新数据库订单信息;


ping++

  最后是【放弃】了的,这里只是想吐槽一下~  在网上查阅了些资料后,发现个似乎不错的东西:ping++的支付SDK,感觉似乎还不错~  【注册】->【添加应用】->【上传各种key】->【PHP端集成SDK】  似乎一切都在预想中进行,其实在刚开始的时候心里就有些抵触:支付这个东西跟钱有关,要是做的不安全可能就......这些key都给了ping++,他们拿到了公司的支付宝的各种key各种公钥私钥.......  根据ping++的文档,完成第一步生成签名信息后,返回给客户端,客户端根据签名信息完成支付;但是后面的步骤就没有了~  在ping++中,生成签名信息的时候并没有设置通知url的地方,也有可能是我没有细心的看文档吧~咨询ping++的客服后,告诉我是由客户端通知我们自己的服务器~

  当此为止,我也就只能放弃掉ping++了,因为在金钱上面安全才是第一位,由客户端通知服务器这个逻辑在一下情况下是不可行的:

1.在支付成功后,客户端突然退出程序(死机、断电、程序崩溃等等);2.请求被人劫持,篡改信息(金额、数量、或者压根没有支付);

  再加上ping++处理工单的时间太慢,客服回复也慢,以后要是出了大问题需要及时处理,找不到人就麻烦了,也就只能将其抛弃了~


支付宝SDK

  从头说起吧:

支付宝

    1.首先到支付宝开放平台注册账号;  2.下载官方提供的demo;  3.获取各种key,并在alipay.config.php文件中进行配置,使用的MD5方式签名$alipay_config['key']需要填写,如果是RSA方式签名则不需要,但是需要生成公钥和私钥(这里以MD5为例);

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//合作身份者id,以2088开头的16位纯数字$alipay_config['partner']        = '';//收款支付宝账号,一般情况下收款账号就是签约账号$alipay_config['seller_email']    = '';//安全检验码,以数字和字母组成的32位字符$alipay_config['key']            = '';$alipay_config['success_url'] = "";//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
登录后复制

  4.生成支付order签名(这里以MD5为例);

require_once("lib/alipay_core.function.php");require_once("lib/alipay_md5.function.php");function alipaySign($amount,$orderNo){    require_once("alipay.config.php");    $ali = array(      'service' => 'mobile.securitypay.pay',      'partner' => $alipay_config['partner'],//      '_input_charset' => $alipay_config['input_charset'],      'notify_url' => $alipay_config['success_url'],//回调地址      'out_trade_no' => $orderNo,//商户网站唯一订单号      'subject' => "subject",//商品名称      'payment_type' => 1,//支付类型      'seller_id' => $alipay_config['seller_email'],//支付宝账号      'total_fee' => $amount,//总金额      'body' => "body",//商品详情    );    $sign_type = $alipay_config['sign_type'];    $para_filter = paraFilter($ali);    $para_sort = argSort($para_filter);    $prestr = createLinkstring($para_sort);    $sign = md5Sign($prestr,$alipay_config['key']);    $str = $prestr.'&sign='.'"'.$sign.'"'.'&sign_type='.'"'.$sign_type.'"';//传给支付宝接口的数据    return $str;  }
登录后复制

  方法中$amount为支付总额,$orderNo为商户平台订单号,然后将签名结果返回给客户端。

  5.客户端得到支付签名信息后,调用支付宝的SDK直接进行支付,这里就不再细说,毕竟本文主要点不在这里;

  然后客户端并没有支付成功,错误码是输入参数错误。

支付失败 ALI38173

    查阅了支付宝的文档之后,发现传入的参数并没有什么遗漏,问题很有可能是sign的加密上出现了错误。  各种蛋疼之后,发现createLinkstring方法错在一定的问题,这个方法返回的字符串格式是:  key1=value1&key2=value2......  但是客户端传给支付宝后,支付宝通过相同的方法生成sign进行验证,验证不通过导致的。  修改了createLinkstring方法,使得每个value用引号包起来:  key1="value1"&key2="value2"......  这样客户端就可以完成支付了。

function createLinkstring($para) {    $arg  = "";    $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;}
登录后复制

  6.通过生成支付签名的时候设置的notify_url,再支付成功后,支付宝会回调到这个url并将支付结果信息通过post方法传递进来,值得注意的是notify_url中不能包含任何GET方式传递的参数。

//正确http://host/notify_url//错误http://host/notify_url?name=狍子君
登录后复制

  7.服务端验证回调是否合法,这一步相当重要。

1.验证签名;2.验证此次通知知否是支付宝发起的;

function verifyResult(){    require_once("alipay.config.php");    $alipayNotify = new AlipayNotify($alipay_config);    $verify_result = $alipayNotify->verifyNotify();    if($verify_result) {      return true;    }else{      return false;    }  }
登录后复制

  然后又发现了,从支付宝通过notify_id能够获取到这次通知的信息,但是sign签名信息就是验证不通过。

function getSignVeryfy($para_temp, $sign, $sign_type) {    $para_filter = paraFilter($para_temp);    $para_sort = argSort($para_filter);    $prestr = createLinkstring($para_sort);    $isSgin = false;    switch (strtoupper(trim($sign_type))) {       case "MD5" :          $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);        break;        default :           $isSgin = false;    }    return $isSgin;}
登录后复制

  貌似又是createLinkstring的问题,验证的时候value值不加引号,就能够验证通过了,通过MD5加密结果和支付宝传回来的一毛一样。

修改createLinkstring方法:

function createLinkstring($para,$showQuotes = false) {    $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;}
登录后复制

  在生成支付签名信息的时候,$showQuotes传入为true就可以了。

 function alipaySign($amount,$orderNo){    //签名的代码    $prestr = createLinkstring($para_sort,true);    //后面的代码}
登录后复制

  8.然后在验证通过后,就可以修改自己数据库了;

吐槽

  key1=value1&key2=value2......  key1="value1"&key2="value2"......

  就因为这个,把我弄得欲仙欲死,完全不知道什么原因支付不成功,支付成功了又不知为何验证不通过......  在受尽两天的折磨之后,最后是通过charles截取其他有支付类app的订单签名信息,和自己的比对,才发现原来是引号的问题。  RDS方式加密和解密的我并没有去测试,如果你弄了,欢迎交流。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP记录:PHP日志分析的最佳实践 PHP记录:PHP日志分析的最佳实践 Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。 解释PHP中晚期静态结合的概念。 Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

自定义/扩展框架:如何添加自定义功能。 自定义/扩展框架:如何添加自定义功能。 Mar 28, 2025 pm 05:12 PM

本文讨论了将自定义功能添加到框架上,专注于理解体系结构,识别扩展点以及集成和调试的最佳实践。

See all articles