【PHP后台】接入支付宝
我使用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方式加密和解密的我并没有去测试,如果你弄了,欢迎交流。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

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

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

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-

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

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' =>

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

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

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
