Inhaltsverzeichnis
ping++
支付宝SDK
吐槽
Heim Backend-Entwicklung PHP-Tutorial 【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'] = "";//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
Nach dem Login kopieren

  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;  }
Nach dem Login kopieren

  方法中$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;}
Nach dem Login kopieren

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

//正确http://host/notify_url//错误http://host/notify_url?name=狍子君
Nach dem Login kopieren

  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;    }  }
Nach dem Login kopieren

  然后又发现了,从支付宝通过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;}
Nach dem Login kopieren

  貌似又是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;}
Nach dem Login kopieren

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

 function alipaySign($amount,$orderNo){    //签名的代码    $prestr = createLinkstring($para_sort,true);    //后面的代码}
Nach dem Login kopieren

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

吐槽

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

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium) 11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium) Mar 03, 2025 am 10:49 AM

Lange URLs, die oft mit Schlüsselwörtern und Tracking -Parametern überfüllt sind, können Besucher abschrecken. Ein URL -Verkürzungsskript bietet eine Lösung, die präzise Links erstellt, die ideal für soziale Medien und andere Plattformen sind. Diese Skripte sind für einzelne Websites a wertvoll

Einführung in die Instagram -API Einführung in die Instagram -API Mar 02, 2025 am 09:32 AM

Nach seiner hochkarätigen Akquisition durch Facebook im Jahr 2012 nahm Instagram zwei APIs für den Einsatz von Drittanbietern ein. Dies sind die Instagram -Graph -API und die Instagram Basic Display -API. Ein Entwickler, der eine App erstellt, die Informationen von a benötigt

Arbeiten mit Flash -Sitzungsdaten in Laravel Arbeiten mit Flash -Sitzungsdaten in Laravel Mar 12, 2025 pm 05:08 PM

Laravel vereinfacht die Behandlung von temporären Sitzungsdaten mithilfe seiner intuitiven Flash -Methoden. Dies ist perfekt zum Anzeigen von kurzen Nachrichten, Warnungen oder Benachrichtigungen in Ihrer Anwendung. Die Daten bestehen nur für die nachfolgende Anfrage standardmäßig: $ Anfrage-

Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Mar 04, 2025 am 09:33 AM

Dies ist der zweite und letzte Teil der Serie zum Aufbau einer Reaktionsanwendung mit einem Laravel-Back-End. Im ersten Teil der Serie haben wir eine erholsame API erstellt, die Laravel für eine grundlegende Produktlistenanwendung unter Verwendung von Laravel erstellt hat. In diesem Tutorial werden wir Dev sein

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Mar 12, 2025 pm 05:09 PM

Laravel bietet eine kurze HTTP -Antwortsimulationssyntax und vereinfache HTTP -Interaktionstests. Dieser Ansatz reduziert die Code -Redundanz erheblich, während Ihre Testsimulation intuitiver wird. Die grundlegende Implementierung bietet eine Vielzahl von Verknüpfungen zum Antworttyp: Verwenden Sie Illuminate \ Support \ facades \ http; Http :: fake ([ 'Google.com' => 'Hallo Welt',, 'github.com' => ['foo' => 'bar'], 'Forge.laravel.com' =>

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Ankündigung von 2025 PHP Situation Survey Ankündigung von 2025 PHP Situation Survey Mar 03, 2025 pm 04:20 PM

Die 2025 PHP Landscape Survey untersucht die aktuellen PHP -Entwicklungstrends. Es untersucht Framework -Nutzung, Bereitstellungsmethoden und Herausforderungen, die darauf abzielen, Entwicklern und Unternehmen Einblicke zu geben. Die Umfrage erwartet das Wachstum der modernen PHP -Versio

See all articles