iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP 实现支付宝 “(单笔转账)转账到支付宝账号”
  • 450
分享到

PHP 实现支付宝 “(单笔转账)转账到支付宝账号”

phpmysql 2023-09-01 09:09:44 450人浏览 八月长安
摘要

目录 前言 一、服务层 二、控制层 1.控制层 2.接口返回参数实例 前言 单笔转账接口 | 网页&移动应用 准备: 应用的证书(证书申请和配置可以参考我另一篇分享“支付宝 ‘应用证书配置’ ”) 配置证书后注意公共参数中 私钥值 是c

目录

前言

一、服务层

二、控制层

1.控制层

2.接口返回参数实例


前言

单笔转账接口 | 网页&移动应用

准备:

应用的证书(证书申请和配置可以参考我另一篇分享“支付宝 ‘应用证书配置’ ”)

配置证书后注意公共参数中 私钥值 是csr生成后的私钥

需要接口能力已开通


一、服务层

 "测试订单号".time(),               // 订单总金额,单位为元,不支持千位分隔符,精确到小数点后两位                         "trans_amount" => $transAmount,            // 固定为 TRANS_ACCOUNT_NO_PWD                      "product_code" => "TRANS_ACCOUNT_NO_PWD",            // 固定为 DIRECT_TRANSFER            "biz_scene"    => "DIRECT_TRANSFER",            // 转账业务的标题:收款方会收到                 "order_title"  => "测试支付",            // 收款方信息                          "payee_info"   => [                  // 参与方的标识 ID:ALIPAY_USER_ID(UID) ALIPAY_LOGON_ID(支付宝登录号)        "identity"      => $alipayUserId,                "identity_type" => "ALIPAY_USER_ID",                   // "name"          => "真实姓名",          //  identity_type = ALIPAY_LOGON_ID name必填            ]        ];        // 请求参数                $params = [            "app_id"              => self::APPID,            "method"              => self::METHOD_TRANSFER,            "format"              => self::FORMAT,            "charset"             => self::CHARSET,            "sign_type"           => self::SIGNTYPE,            "timestamp"           => date('Y-m-d H:i:s'),            "version"             => self::VERSION,            "biz_content"         => json_encode($biz_content, 256),            "alipay_root_cert_sn" => $this->getRootCertSN(dirname(__FILE__) . self::ALIPAY_ROOT_CERT),     // 支付宝根证书路径            "app_cert_sn"         => $this->getCertSN(dirname(__FILE__) . self::ALIPAY_CERT_PUBLIC_KEY),   // 应用公钥证书路径        ];        // 签名                $params["sign"]    = $this->generateSign($params, $params['sign_type']);        // 发起请求        $result = $this->curlPost('https://openapi.alipay.com/gateway.do', $params);        // 结果数组化        $result = json_decode($result, true);        return $result;    }        public function getAccessToken($authCode)    {        //公共参数        $params = array(            "app_id"              => self::APPID,            "method"              => self::METHOD_OAUTH_TOKEN,            "format"              => self::FORMAT,            "charset"             => self::CHARSET,            "sign_type"           => self::SIGNTYPE,            "timestamp"           => date("Y-m-d H:i:s"),            "version"             => self::VERSION,            "grant_type"          => self::TOKE_NGRANT_TYPE,            "code"                => $authCode,            "alipay_root_cert_sn" => $this->getRootCertSN(dirname(__FILE__) . self::ALIPAY_ROOT_CERT),     // 支付宝根证书路径            "app_cert_sn"         => $this->getCertSN(dirname(__FILE__) . self::ALIPAY_CERT_PUBLIC_KEY),   // 应用公钥证书路径        );        // 签名               $params["sign"] = $this->generateSign($params, $params['sign_type']);        // 发起请求        $result = $this->curlPost("https://openapi.alipay.com/gateway.do?charset=" . self::CHARSET, $params);        // 结果数组化        $result = json_decode($result, true);        return $result;    }            public function generateSign($params, $signType)    {        return $this->sign($this->getSignContent($params), $signType);    }    protected function sign($data, $signType)    {        $priKey = self::RSAPRIVATEKEY;        $res = "-----BEGIN RSA PRIVATE KEY-----\n" .            Wordwrap($priKey, 64, "\n", true) .            "\n-----END RSA PRIVATE KEY-----";        ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');        if ($signType == "RSA2") {            openssl_sign($data, $sign, $res, OPENSSL_ALGo_SHA256);            // OPENSSL_ALGO_SHA256是PHP5.4.8以上版本才支持            // openssl_sign($data, $sign, $res, version_compare(php_VERSION, '5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);        } else {            openssl_sign($data, $sign, $res);        }        $sign = base64_encode($sign);        return $sign;    }        protected function checkEmpty($value)    {        if (!isset($value))            return true;        if ($value === null)            return true;        if (trim($value) === "")            return true;        return false;    }    public function getSignContent($params)    {        ksort($params);        $stringToBeSigned = "";        $i = 0;        foreach ($params as $k => $v) {            if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {                // 转换成目标字符集                $v = $this->characet($v, self::CHARSET);                if ($i == 0) {                    $stringToBeSigned .= "$k" . "=" . "$v";                } else {                    $stringToBeSigned .= "&" . "$k" . "=" . "$v";                }                $i++;            }        }        unset($k, $v);        return $stringToBeSigned;    }        function characet($data, $targetCharset)    {        if (!empty($data)) {            $fileType = self::CHARSET;            if (strcasecmp($fileType, $targetCharset) != 0) {                $data = mb_convert_encoding($data, $targetCharset, $fileType);            }        }        return $data;    }        protected function curlPost($url, $postFields = null)    {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_FaiLONERROR, false);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);        $postBodyString = "";        $encodeArray = array();        $postMultipart = false;        if (is_array($postFields) && 0 < count($postFields)) {            foreach ($postFields as $k => $v) {                if ("@" != substr($v, 0, 1)) //判断是不是文件上传                {                    $postBodyString .= "$k=" . urlencode($this->characet($v, self::CHARSET)) . "&";                    $encodeArray[$k] = $this->characet($v, self::CHARSET);                } else //文件上传用multipart/form-data,否则用www-form-urlencoded                {                    $postMultipart = true;                    $encodeArray[$k] = new \CURLFile(substr($v, 1));                }            }            unset($k, $v);            curl_setopt($ch, CURLOPT_POST, true);            if ($postMultipart) {                curl_setopt($ch, CURLOPT_POSTFIELDS, $encodeArray);            } else {                curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString, 0, -1));            }        }        if (!$postMultipart) {            $headers = array('content-type: application/x-www-form-urlencoded;charset=' . self::CHARSET);            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);        }        $reponse = curl_exec($ch);        if (curl_errno($ch)) {            throw new \Exception(curl_error($ch), 0);        } else {            $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);            if (200 !== $httpStatusCode) {                throw new \Exception($reponse, $httpStatusCode);            }        }        curl_close($ch);        return $reponse;    }        public function getCertSN($certPath)    {        $cert = file_get_contents($certPath);        $ssl = openssl_x509_parse($cert);        $SN = md5($this->array2string(array_reverse($ssl['issuer'])) . $ssl['serialNumber']);        return $SN;    }        public function getRootCertSN($certPath)    {        $cert = file_get_contents($certPath);        $this->alipayRootCertContent = $cert;        $array = explode("-----END CERTIFICATE-----", $cert);        $SN = null;        for ($i = 0; $i < count($array) - 1; $i++) {            $ssl[$i] = openssl_x509_parse($array[$i] . "-----END CERTIFICATE-----");            if (strpos($ssl[$i]['serialNumber'], '0x') === 0) {                $ssl[$i]['serialNumber'] = $this->hex2dec($ssl[$i]['serialNumberHex']);            }            if ($ssl[$i]['signatureTypeLN'] == "sha1WithRSAEncryption" || $ssl[$i]['signatureTypeLN'] == "sha256WithRSAEncryption") {                if ($SN == null) {                    $SN = md5($this->array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);                } else {                    $SN = $SN . "_" . md5($this->array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);                }            }        }        return $SN;    }        function hex2dec($hex)    {        $dec = 0;        $len = strlen($hex);        for ($i = 1; $i <= $len; $i++) {            $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));        }        return $dec;    }    protected function array2string($array)    {        $string = [];        if ($array && is_array($array)) {            foreach ($array as $key => $value) {                $string[] = $key . '=' . $value;            }        }        return implode(',', $string);    }}

二、控制层

1.控制层

        public function getAccessToken($authCode,$nMoney)    {        $cAlipayMethod = new AlipayMethod();        // 换取授权访问令牌(获取返回中code对应的user_id)        $result        = $cAlipayMethod->getAccessToken($authCode);        if (!isset($result["alipay_system_oauth_token_response"])) {            // 换取授权访问令牌失败            return json(["code" => 0, "data" => $result]);        } else {            // 获取用户唯一标识            $alipayUserId = $result["alipay_system_oauth_token_response"]["user_id"];            // 请求转账            $result       = $cAlipayMethod->onPaymentByAlipay($alipayUserId, $nMoney);         if ($result["alipay_fund_trans_uni_transfer_response"]["code"] == "10000") {                dump("转账成功")                // 业务逻辑            } else {                dump("转账失败")                // 业务逻辑            }        }    }

2.接口返回参数实例

alipay.system.oauth.token(换取授权访问令牌):成功:{   "alipay_system_oauth_token_response": {      "access_token": "....",      "alipay_user_id": "....",      "auth_start": "2022-11-19 11:05:18",      "expires_in": ....,      "re_expires_in": ....,      "refresh_token": "....",      "user_id": "...."                       // 用户标识:是我们需要的   },   "alipay_cert_sn": "....",   "sign": "...."}错误:{   "error_response": {      "code": "40002",      "msg": "Invalid Arguments",      "sub_code": "isv.code-invalid",      "sub_msg": "授权码code无效"   },   "alipay_cert_sn": "....",   "sign": "...."}alipay.fund.trans.uni.transfer(单笔转账接口)转账到支付宝账号:成功:{   "alipay_fund_trans_uni_transfer_response": {      "code": "10000",      "msg": "Success",      "order_id": "....",      "out_biz_no": "....",      "pay_fund_order_id": "....",      "status": "SUCCESS",      "trans_date": "2022-11-18 13:45:02"   },   "alipay_cert_sn": "....",   "sign": "...."}异常:{   "alipay_fund_trans_uni_transfer_response": {      "code": "40004",      "msg": "Business Failed",      "sub_code": "INVALID_PARAMETER",      "sub_msg": "参数有误参数payee_info.identity格式非法"   },   "alipay_cert_sn": "....",   "sign": "...."}

来源地址:https://blog.csdn.net/arlene12345/article/details/127961508

--结束END--

本文标题: PHP 实现支付宝 “(单笔转账)转账到支付宝账号”

本文链接: https://www.lsjlt.com/news/388046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP 实现支付宝 “(单笔转账)转账到支付宝账号”
    目录 前言 一、服务层 二、控制层 1.控制层 2.接口返回参数实例 前言 单笔转账接口 | 网页&移动应用 准备: 应用的证书(证书申请和配置可以参考我另一篇分享“支付宝 ‘应用证书配置’ ”) 配置证书后注意公共参数中 私钥值 是c...
    99+
    2023-09-01
    php mysql
  • PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本
    支付宝某些业务只能使用公钥证书方式来验签 如:即使转账      红包等 笔者就要实现这样一个功能,【单笔转账到支付宝账户】,采用支付宝公钥证书签名来实现。 话不多说,流程先走起 第一步:下载支付宝秘钥生成器 由于我们使用的是php鱼...
    99+
    2023-09-03
    服务器 java 运维
  • PHP 实现微信支付 “商家转账到零钱”
    目录 一、日常填坑:注意事项 二、代码示例 1.微信服务层 2.请求层 总结 一、日常填坑:注意事项 转账低于5毛会失败 转账金额需要自己取整一下,不然运气来了会出现以下问题 { "code":"PARAM_ERROR",...
    99+
    2023-09-01
    php 微信 http
  • 如何用php实现支付宝支付
    这篇文章主要讲解了“如何用php实现支付宝支付”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用php实现支付宝支付”吧!用php实现支付宝支付的方法:1、扫码登录支付宝开放平台注册;2、...
    99+
    2023-06-21
  • win7系统下支付宝打不开无法进行付款与转账
      现如今,快节奏的工作生活,越来越多的朋友喜欢在网上购物,而最大的支付平台支付宝,不仅可以付款还可以转账等功能。在win7系统下支付宝网页打不开,这是怎么回事 支付宝   一、首先排除是否电脑中病毒的问题   当遇到支...
    99+
    2023-06-08
    win7 支付宝 系统 转账 付款
  • 如何在PHP中实现支付宝支付
    随着电子商务的不断发展,各种在线支付方式也在不断涌现。支付宝作为国内普及度最高的支付方式之一,已经成为很多电商企业不可或缺的一部分。本文将介绍如何在PHP中实现支付宝支付的功能。一、注册支付宝开发平台账号在开始之前,我们需要注册一个支付宝开...
    99+
    2023-05-20
    PHP 实现 支付宝支付
  • 购买云服务器怎么开通支付宝账号
    一、购买云服务器 购买云服务器是购买阿里云的产品。您需要在淘宝或者天猫平台上搜索“云服务器”或者“阿里云服务器”,找到您需要的云服务器品牌和型号,然后下单购买。下单后,您需要填写订单信息、付款信息和物流信息等,等待阿里云的工作人员为您发货...
    99+
    2023-10-28
    支付宝 账号 服务器
  • PHP 实现微信支付 “请求单次分账”
    目录 一、小总结 二、服务层 一、小总结 分账 调用分账的订单必须是请求下单中以下参数等于  Y 的订单并且在下单接口中该参数也等于 Y 才能使用分账(可以参考一下PHP JSAPI调起微信支付API_一本曾经的博客-CSDN博客) "p...
    99+
    2023-09-01
    python 开发语言
  • 最新PHP对接微信支付,发起商家转账API,商家转账到零钱
    ...
    99+
    2023-09-26
    ThinkPHP5.0 php 微信
  • Thinkphp5.0支付宝在线支付下单流程怎么实现
    本篇内容主要讲解“Thinkphp5.0支付宝在线支付下单流程怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Thinkphp5.0支付宝在线支付下单流程怎么实现”吧!Thinkphp5....
    99+
    2023-06-04
  • PHP微信支付 “商家转账到零钱”一文概述
    PHP微信支付 商家转账到零钱 这里有个坑 转账低于5毛会失败 转账金额需要自己取整一下,微信官方金额是 分 为单位,换算成 元 时可能会除不尽 { "code":"PARAM_ERROR...
    99+
    2023-09-12
    php 微信 开发语言
  • 微信支付 商家转账到零钱 Api 过程
    企业付款到零钱,已经限额500以内,完全不够用 商家转账到零钱,限额20000单笔,需要申请要按不通过原因修改多试几次 准备前提: 1,平台证书,商家证书,一共2个; 2,设置APIv3密钥; 正文: 商家证书可直接申请下载: https:...
    99+
    2023-09-03
    微信 php
  • 购买云服务器怎么开通支付宝账户
    首先,让我们了解一下如何开通支付宝云服务器。在购买云服务器之前,您需要选择合适的服务器提供商。通常,选择一个可靠的服务器提供商是非常重要的。选择服务器提供商时,您需要考虑以下几个因素: 服务器的硬件配置:服务器的硬件配置是指服务器的处理...
    99+
    2023-10-28
    支付宝 账户 服务器
  • PHP 实现支付宝APP 支付 (服务端 + 客户端 + 异步)
    目录 一、使用实例 二、服务端 1.下载SDK 2.业务层 3.业务层返回实例 推荐使用联调工具: 4.回调层 三、客户端 总结 一、使用实例 官方信息: 二、服务端 1.下载SDK App 支付服务端 DEMO&...
    99+
    2023-09-18
    python pandas php mysql thinkphp
  • 如何用PHP实现微信支付对账单查询
    随着移动支付的流行,微信支付成为了一个不可忽视的支付方式。作为开发人员,在使用微信支付时,对账单查询是必不可少的环节。本文将介绍如何利用PHP语言实现微信支付对账单的查询。获取微信支付账号信息在使用微信支付前,首先需要配置微信支付账号信息。...
    99+
    2023-05-14
    PHP 微信支付 对账单查询
  • 阿里云服务器购买后如何使用支付宝账号
    阿里云服务器是阿里巴巴公司开发和提供的云计算服务,用户可以通过支付宝账号进行购买使用。以下是使用支付宝账号购买使用阿里云服务器时的详细步骤: 登录阿里云帐号,进入“我的阿里云”页面,选择您要购买的服务器类别,点击“立即购买”按钮。 在购...
    99+
    2023-10-27
    阿里 如何使用 支付宝
  • PHP个人发卡网源码支持当面付/码支付/易支付+免签即时到账全解密
      PHP个人发卡网是您在线销售的任何没有物理形式或物质的产品。您可以将PHP个人发卡网变成实体产品。例如,许多人购买PDF 格式的电子书,然后在计算机上打印出来。该产品成为实体产品,但它以数字格式开始。PHP个人发卡网源码让销售PHP个人...
    99+
    2023-09-05
    php javascript 前端
  • 阿里云服务器怎么更换支付宝账户提现方式
    步骤1:确认支付宝账户是否为自己本人的账户 如果您已经使用了阿里云账户进行提现,那么必须确保您的支付宝账户是您本人的账户。否则,您需要联系支付宝客服,进行支付宝账户更换的操作。 步骤2:检查支付宝账户的支付方式是否为自己设置的支付方式 如...
    99+
    2023-10-28
    阿里 支付宝 账户
  • 实现支付宝APP扫码跳转小程序并传参
    目录 功能需求 实现思路 第一步,发布二维码的关联规则 发布关联规则的步骤 精确匹配和模糊匹配的区别 精确匹配 模糊匹配 添加小程序功能页 发布关联规则 第二步,读取参数 小程序应用的生命周期 获取二维码中携带的参数 我的需求实现代码片段...
    99+
    2023-09-03
    小程序 vue.js
  • 利用Python实现QQ实时到账免签支付功能
    原创 转载请注明出处 核心部分:解决QQ的登录验证问题 主要利用python的selenium库和QQ的快速登录实现登录网页 再利用抓到的json来输出今日的订单情况 直接上代码 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作