支付宝接入流程
来源:互联网 发布:技盖至此乎翻译 编辑:程序博客网 时间:2024/05/21 08:46
主要接入支付的支付功能,包括电脑网站支付、手机网站支付、APP支付、当面付。
使用语言:PHP
官方文档:https://doc.open.alipay.com/docs/doc.htm?treeId=193&articleId=105899&docType=1
一、开发前的准备,参考官方文档
https://doc.open.alipay.com/docs/doc.htm?treeId=193&articleId=105894&docType=1二、下载服务端SDK
https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1
三、沙箱环境调试
上线前先在沙箱环境下进行测试,支付宝提供了专门的沙箱APP,可以任意充值测试。
注意:使用沙箱环境测试时,需要使用沙箱环境中的相关参数。
四、服务端代码
>>>下载SDK后,删除不要的文件,放入自己的目录中,即可直接使用
五、注意
>>>沙箱环境时有专门的key
>>>程序中使用的公钥是支付的公钥,不是自己生存的公钥。
>>>支付宝类,直接调用SDK中的代码,提供各种支付能力接口。
电脑网站支付:pay函数
手机完整支付:jsPay函数
APP接口:appApi函数,主要用于获取APP支付的相关参数(由于私钥存储在服务端,需要通过私钥加密相关参数)
当面付:generateQrCode函数,内部系统使用,生成当面付的支付二维码,发给客户让客户进行支付。
<?phpclass Dg_Pay_Zhifubao{ /** * 支付网关 * * @var string */ private $gatewayUrl = 'https://openapi.alipay.com/gateway.do'; /** * 异步通知URL * * @var string */ private $notifyUrl = 'https://www.baidu.com'; /** * 支付后跳转地址 * * @var string */ private $returnUrl = 'https://www.baidu.com'; private $returnUrlM = 'https://www.baidu.com'; /** * 支付宝分配的应用ID * * @var string */ private $appId = 'xxx'; /** * 收款支付宝账号 * * @var string */ private $sellerEmail = ''; /** * 卖家支付宝用户号 * * @var string */ private $sellerId = 'xxx'; /** * 商户私钥 * * @var string */ private $privateKey; private $privateKeyPath; /** * 支付宝公钥(此处是支付宝生成的公钥) * * @var string */ private $publicKey; private $publicKeyPath; /** * 签名方式 * * @var string */ private $signType = 'RSA2'; /** * 返回值数据类型 * * @var string */ private $format = 'json'; /** * 请求编码 * * @var string */ private $charset = 'utf-8'; /** * 初始化支付参数 * * @param string $out_trade_no * 订单号 * @param double $total_fee * 交易金额 * @param string $subject * 商品名称 * @param string $body * 商品描述 */ public function __construct() { $this->privateKeyPath = dirname(__FILE__) . DS . 'zhifubao_private_key.pem'; $this->publicKey = 'xxx'; //ToDo 沙箱测试参数 if ( false ) { $this->gatewayUrl = 'https://openapi.alipaydev.com/gateway.do'; $this->appId = 'xxx'; $this->sellerId = 'xxx'; $this->notifyUrl = 'https://www.baidu.com'; $this->returnUrl = 'https://www.baidu.com'; $this->returnUrlM = 'https://www.baidu.com'; $this->publicKey = 'xxx'; } //引入支付宝SDK include_once("alipay/AopSdk.php"); } /** * 生成支付地址 * * @return string */ public function pay($out_trade_no, $total_fee, $subject = '缴费', $body = '缴费') { $client = new AopClient; $client->gatewayUrl = $this->gatewayUrl; $client->appId = $this->appId; $client->rsaPrivateKeyFilePath = $this->privateKeyPath; $client->alipayrsaPublicKey = $this->publicKey; $client->apiVersion = '1.0'; $client->signType = $this->signType; $client->postCharset= $this->charset; $client->format = $this->format; $request = new AlipayTradePagePayRequest(); $bizParam = array( 'product_code' => 'FAST_INSTANT_TRADE_PAY', 'out_trade_no' => $out_trade_no, 'total_amount' => $total_fee, 'subject' => $subject, 'body' => $body, 'seller_id' => $this->sellerId, ); $bizContent = json_encode($bizParam, JSON_UNESCAPED_UNICODE); $request->setBizContent($bizContent); $request->setNotifyUrl($this->notifyUrl); $request->setReturnUrl($this->returnUrl); $response = $client->pageExecute($request); //指定编码,360、qq浏览器下,浏览器没有设置为自动检测编码,会有问题。 header("Content-type: text/html; charset=utf-8"); echo $response; } /** * JS支付 * * @return array */ public function jsPay($out_trade_no, $total_fee, $body, $wx_app = 'APP' , $platform = 'ios') { $client = new AopClient; $client->gatewayUrl = $this->gatewayUrl; $client->appId = $this->appId; $client->rsaPrivateKeyFilePath = $this->privateKeyPath; $client->alipayrsaPublicKey = $this->publicKey; $client->apiVersion = '1.0'; $client->signType = $this->signType; $client->postCharset= $this->charset; $client->format = $this->format; $request = new AlipayTradeWapPayRequest(); $bizParam = array( 'product_code' => 'QUICK_WAP_PAY', 'seller_id' => $this->sellerId, 'out_trade_no' => $out_trade_no, 'total_amount' => $total_fee, 'subject' => $body, 'body' => $body, ); $bizContent = json_encode($bizParam, JSON_UNESCAPED_UNICODE); $request->setBizContent($bizContent); $request->setNotifyUrl($this->notifyUrl); $request->setReturnUrl($this->returnUrlM); $response = $client->pageExecute($request); header("Content-type: text/html; charset=utf-8"); echo $response; } /** * APP获得支付参数 * * @return array */ public function appApi($out_trade_no, $total_fee, $body, $wx_app = 'APP' , $platform = 'ios') { $client = new AopClient; $client->gatewayUrl = $this->gatewayUrl; $client->appId = $this->appId; $client->rsaPrivateKeyFilePath = $this->privateKeyPath; $client->alipayrsaPublicKey = $this->publicKey; $client->format = $this->format; $client->charset = $this->charset; $client->signType = $this->signType; $request = new AlipayTradeAppPayRequest(); $bizParam = array( 'product_code' => 'QUICK_MSECURITY_PAY', 'seller_id' => $this->sellerId, 'out_trade_no' => $out_trade_no, 'total_amount' => $total_fee, 'subject' => $body, 'body' => $body, ); $request->setNotifyUrl($this->notifyUrl); $bizContent = json_encode($bizParam, JSON_UNESCAPED_UNICODE); $request->setBizContent($bizContent); $response = $client->sdkExecute($request); //解析参数,此处返回字符串,APP需要json parse_str($response, $responseJson); //私钥 $responseJson['private_key'] = $this->_getPrivateKey(); return Dg_Helper_Common::initReturn(NO_ERROR, NO_ERROR, $responseJson); } /** * 生成支付二维码 * * @return array */ public function generateQrCode($out_trade_no, $total_fee, $subject = '缴费', $body = '缴费') { $client = new AopClient; $client->gatewayUrl = $this->gatewayUrl; $client->appId = $this->appId; $client->rsaPrivateKeyFilePath = $this->privateKeyPath; $client->alipayrsaPublicKey = $this->publicKey; $client->apiVersion = '1.0'; $client->format = $this->format; $client->postCharset = $this->charset; $client->signType = $this->signType; $request = new AlipayTradePrecreateRequest(); $bizParam = array( 'seller_id' => $this->sellerId, 'out_trade_no' => $out_trade_no, 'total_amount' => $total_fee, 'subject' => $body, 'body' => $body, ); $request->setNotifyUrl($this->notifyUrl); $bizContent = json_encode($bizParam, JSON_UNESCAPED_UNICODE); $request->setBizContent($bizContent); try { $response = $client->execute($request); //返回的是对象 $response = json_decode(json_encode($response), true); if ( isset($response['alipay_trade_precreate_response']) && $response['alipay_trade_precreate_response']['code'] == '10000' ) { return Dg_Helper_Common::initReturn(NO_ERROR, NO_ERROR, $response['alipay_trade_precreate_response']); } else { return Dg_Helper_Common::initReturn(ERROR_COMMON , NO_ERROR , $response['alipay_trade_precreate_response']['msg'].' '.$response['alipay_trade_precreate_response']['sub_msg']); } } catch (Exception $e) { return Dg_Helper_Common::initReturn(ERROR_COMMON , NO_ERROR , $e->getMessage()); } } /** * 验证签名 * * @param array $data 支付宝返回的参数 * @return bool */ public function verify($data) { if ( $data['seller_id'] != $this->sellerId ) { return false; } if ( $data['app_id'] != $this->appId ) { return false; } $client = new AopClient; $client->alipayrsaPublicKey = $this->publicKey; $result = $client->rsaCheckV1($data, '', $this->signType); return $result; } /** * 获得私钥 * * @return string */ private function _getPrivateKey() { $privateKey = ''; if ( file_exists($this->privateKeyPath) ) { $privateKey = file_get_contents($this->privateKeyPath); $privateKey = str_replace(array('-----BEGIN RSA PRIVATE KEY-----','-----END RSA PRIVATE KEY-----'), '', $privateKey); $privateKey = str_replace("\r\n", '', $privateKey); } return $privateKey; }}?>
阅读全文
1 1
- 支付宝接入流程
- 支付宝接入流程
- app接入支付宝流程
- Android 支付宝接入流程
- Android 支付宝接入流程
- 支付宝接入流程---热点问题
- 支付宝支付的服务端接入流程
- 支付宝java后台接入简单流程
- android支付宝的接入流程
- App接入支付宝开发流程
- Payssion支付接入流程
- Android 支付宝以及微信支付快速接入流程
- Android 支付宝以及微信支付快速接入流程
- Android 支付宝以及微信支付快速接入流程
- Android 支付宝以及微信支付快速接入流程
- Android 支付宝以及微信支付快速接入流程
- Android 支付宝以及微信支付快速接入流程
- Android 支付宝以及微信支付快速接入流程
- undefined reference to `udev_device_get_action'
- 《高性能网站建设指南》
- iOS/Swift3.0 修改状态栏文字的颜色
- java 将字符串中含有unicode 转成中文
- 使用appium在android7.0真机上测试程序时报错command failed shell "ps 'uiautomator'"的解决方式
- 支付宝接入流程
- Android借用Arouter进行组件化旧城改造。
- 同步和互斥的一些问题(死锁,优先级逆转)
- Linux 中VI VIM 编译器
- UVa 1363
- docker的创建和使用
- mysql查询日期补全(连续)方法
- AWS云生态助推 亚马逊股价突破千元
- Java线程:线程的调度-休眠