找到
1
篇与
晓翼易支付
相关的结果
-
晓翼易支付 PHP API 对接教程:支付退款代付全攻略 晓翼易支付全API对接实操教程:复制即用不踩坑,支付/退款/代付一套搞定 做PHP开发这么久,真心觉得找个好用的支付工具太难了——要么API文档写得云里雾里,示例代码跑起来一堆报错;要么只支持基础支付,退款、代付还得额外对接别的平台;更坑的是有些工具签名逻辑复杂,抠半天代码还验签失败。 mk2lq7ea.png图片 我们字节曜博客一直用晓翼易支付,从对接到底层稳定度都亲测过,现在把全套API的实操教程整理出来,涵盖统一下单、订单查询、退款、代付所有核心功能,每个接口都附可直接复制的PHP代码,替换密钥就能跑,新手半小时也能搞定,分享给有需要的朋友~ 笔者是在竞赛室偷偷写的教程,撰写不易,如有在所难免,文档在此:文档,以文档为准 一、对接前必做:3分钟搞定基础配置(所有API通用) 不管对接哪个接口,先把基础环境和密钥配置好,这步走对了,后面能少踩80%的坑: 1. 先拿核心信息(登录商户后台就能找到) 商户号(mch_id):你的专属标识,在「个人资料」→「基本信息」里一眼就能看到; RSA密钥对:去「API信息」→「密钥管理」生成,会拿到两个密钥——「商户私钥」和「平台公钥」,记好别搞混; 接口网关地址:固定是 https://pay.ziyeyao.com/api/v2,不用自己瞎找; 回调地址(notify_url):自己服务器上的接口地址,得能公网访问,还不能带参数,支付、退款、代付成功后平台会主动通知你。 2. 通用工具函数(必存!所有API都要靠它) 先把签名生成、验签、发送请求的通用函数写好,后续每个接口直接调用就行,不用重复写代码。 <?php /** * 晓翼易支付通用工具类 * 签名、请求、验签全靠它,直接复制用 */ class XyPayUtil { // 替换成你自己的商户私钥(PEM格式,带头尾) private static $privateKey = '-----BEGIN PRIVATE KEY----- 你的商户私钥内容,原样粘贴,别删任何字符 -----END PRIVATE KEY-----'; // 替换成你自己的平台公钥(PEM格式,带头尾) private static $publicKey = '-----BEGIN PUBLIC KEY----- 你的平台公钥内容,原样粘贴 -----END PUBLIC KEY-----'; /** * 生成SHA256WithRSA签名(对接核心,别改逻辑) * @param array $params 要签名的参数数组 * @return string 签名字符串 */ public static function createSign($params) { // 1. 参数按ASCII升序排序(必须这步,不然验签失败) ksort($params); // 2. 拼接成"key=value&key=value"格式 $signStr = http_build_query($params); // 3. 加载私钥 $privateKey = openssl_get_privatekey(self::$privateKey); if (!$privateKey) { throw new Exception("私钥加载失败!检查下私钥格式,是不是漏了头尾标识"); } // 4. 生成签名 openssl_sign($signStr, $sign, $privateKey, OPENSSL_ALGO_SHA256); openssl_free_key($privateKey); // 5. base64编码返回 return base64_encode($sign); } /** * 验证平台返回的签名(防止数据被篡改) * @param array $params 平台返回的参数(不含sign) * @param string $sign 平台返回的签名字符串 * @return bool 验证结果(true=通过) */ public static function verifySign($params, $sign) { ksort($params); $signStr = http_build_query($params); $publicKey = openssl_get_publickey(self::$publicKey); if (!$publicKey) { throw new Exception("公钥加载失败!检查公钥格式是否正确"); } $result = openssl_verify($signStr, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256); openssl_free_key($publicKey); return $result === 1; } /** * 发送POST请求(不用自己调curl,直接用) * @param string $url 接口地址 * @param array $params 请求参数 * @return array 解析后的JSON数据 */ public static function postRequest($url, $params) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 测试环境可以关闭SSL校验,生产环境一定要打开! curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception("请求失败:" . curl_error($ch)); } curl_close($ch); // 解析返回的JSON $result = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception("返回数据格式错了:" . $response); } return $result; } } ?>重点提醒: 私钥和公钥一定要原样粘贴,别删头尾的-----BEGIN PRIVATE KEY-----这些标识,也别多空格; 生产环境记得把CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST改成true,更安全; 密钥别直接写在代码里,生产环境建议存在单独的配置文件,权限设为只读,防止泄露。 二、核心API对接教程(PHP代码直接复制用) 1. 统一下单API——最常用!创建支付订单 不管是卖会员、卖产品,还是博客变现,第一步都是创建支付订单,这个接口会返回支付链接或二维码,用户付完钱会自动回调你的notify_url。 PHP调用代码(替换3处信息就能跑) <?php require_once 'XyPayUtil.php'; // 引入上面的工具类 // 1. 构造请求参数(按自己的业务改) $params = [ 'mch_id' => '123456', // 替换成你的商户号 'out_trade_no' => 'XY' . date('YmdHis') . rand(1000, 9999), // 订单号规则:前缀+时间戳+随机数,避免重复 'total_fee' => 0.01, // 金额(元),测试用0.01元,正式环境改实际金额 'body' => '字节曜博客VIP会员', // 商品描述,会显示在支付页面 'notify_url' => 'https://你的域名/pay/notify.php', // 支付成功后回调的地址 'timestamp' => time(), // 当前时间戳(秒),不用改 'pay_type' => 'wxpay' // 支付方式:wxpay=微信,alipay=支付宝,按需选 ]; // 2. 生成签名(不用动) $params['sign'] = XyPayUtil::createSign($params); // 3. 调用统一下单接口(固定地址,不用改) $url = 'https://pay.ziyeyao.com/api/v2/unified_order'; try { $result = XyPayUtil::postRequest($url, $params); // 4. 验证返回签名(防止数据被篡改) $sign = $result['sign']; unset($result['sign']); // 先移除sign字段再验签 if (!XyPayUtil::verifySign($result, $sign)) { die("签名验证失败!返回数据可能被篡改"); } // 5. 处理结果 if ($result['code'] == 0) { // 成功:拿到支付链接,可生成二维码让用户扫码 echo "订单创建成功!支付链接:" . $result['pay_url']; // 实际项目中可以跳转支付页面,或生成二维码 } else { die("订单创建失败:" . $result['msg']); } } catch (Exception $e) { die("调用失败:" . $e->getMessage()); } ?>成功返回示例(参考格式) { "code": 0, "msg": "success", "out_trade_no": "XY202601061530221234", "trade_no": "XYPay123456789", "pay_url": "https://pay.ziyeyao.com/pay?order=123456", "timestamp": 1735689622, "sign": "加密后的签名字符串" }2. 订单查询API——查支付状态(防止漏单) 有时候用户付了钱,但回调没收到,这时候就用这个接口主动查订单状态,避免漏单。 PHP调用代码 <?php require_once 'XyPayUtil.php'; // 1. 构造参数(只需要商户号和要查的订单号) $params = [ 'mch_id' => '123456', // 你的商户号 'out_trade_no' => 'XY202601061530221234', // 要查询的订单号(之前创建的) 'timestamp' => time() ]; // 2. 生成签名 $params['sign'] = XyPayUtil::createSign($params); // 3. 调用查询接口 $url = 'https://pay.ziyeyao.com/api/v2/order_query'; try { $result = XyPayUtil::postRequest($url, $params); // 验签 $sign = $result['sign']; unset($result['sign']); if (!XyPayUtil::verifySign($result, $sign)) { die("签名验证失败"); } // 处理结果 if ($result['code'] == 0) { echo "订单状态:" . $result['trade_state']; // SUCCESS=支付成功,NOTPAY=未支付 echo "支付金额:" . $result['total_fee'] . "元"; echo "支付时间:" . $result['pay_time']; } else { die("查询失败:" . $result['msg']); } } catch (Exception $e) { die("查询失败:" . $e->getMessage()); } ?>3. 退款申请API——订单退款(支持全额/部分退) 用户要退款、订单出错,都用这个接口,支持全额或部分退款,退款结果会回调你填的notify_url。 PHP调用代码 <?php require_once 'XyPayUtil.php'; // 1. 构造退款参数 $params = [ 'mch_id' => '123456', // 你的商户号 'out_trade_no' => 'XY202601061530221234', // 原支付订单号 'out_refund_no' => 'RF' . date('YmdHis') . rand(1000, 9999), // 退款单号,自己生成,唯一 'refund_fee' => 0.01, // 退款金额(不能超过原订单金额) 'refund_desc' => '用户主动申请退款', // 退款原因,会显示在后台 'notify_url' => 'https://你的域名/refund/notify.php', // 退款结果回调地址 'timestamp' => time() ]; // 2. 生成签名 $params['sign'] = XyPayUtil::createSign($params); // 3. 调用退款接口 $url = 'https://pay.ziyeyao.com/api/v2/refund'; try { $result = XyPayUtil::postRequest($url, $params); // 验签 $sign = $result['sign']; unset($result['sign']); if (!XyPayUtil::verifySign($result, $sign)) { die("签名验证失败"); } // 处理结果 if ($result['code'] == 0) { echo "退款申请提交成功!退款单号:" . $result['out_refund_no']; // 后续可以通过退款查询接口查进度 } else { die("退款申请失败:" . $result['msg']); } } catch (Exception $e) { die("退款调用失败:" . $e->getMessage()); } ?>4. 退款查询API——查退款进度(用户催单用) 用户问“退款什么时候到账”,用这个接口查状态,不用登录后台手动查。 PHP调用代码 <?php require_once 'XyPayUtil.php'; // 1. 构造参数 $params = [ 'mch_id' => '123456', // 你的商户号 'out_refund_no' => 'RF202601061535225678', // 要查的退款单号 'timestamp' => time() ]; // 2. 生成签名 $params['sign'] = XyPayUtil::createSign($params); // 3. 调用查询接口 $url = 'https://pay.ziyeyao.com/api/v2/refund_query'; try { $result = XyPayUtil::postRequest($url, $params); // 验签 $sign = $result['sign']; unset($result['sign']); if (!XyPayUtil::verifySign($result, $sign)) { die("签名验证失败"); } // 处理结果 if ($result['code'] == 0) { echo "退款状态:" . $result['refund_state']; // SUCCESS=到账,PROCESSING=处理中,FAIL=失败 echo "退款到账时间:" . $result['refund_time']; echo "退款金额:" . $result['refund_fee'] . "元"; } else { die("查询失败:" . $result['msg']); } } catch (Exception $e) { die("查询失败:" . $e->getMessage()); } ?>5. 代付申请API——给用户打款(佣金/提现用) 给合作方结佣金、用户提现,直接用这个接口打款到微信或支付宝,不用手动转账。 PHP调用代码 <?php require_once 'XyPayUtil.php'; // 1. 构造代付参数 $params = [ 'mch_id' => '123456', // 你的商户号 'out_transfer_no' => 'TF' . date('YmdHis') . rand(1000, 9999), // 代付单号,唯一 'payee_type' => 'wx', // 收款类型:wx=微信,alipay=支付宝 'payee_account' => '13800138000', // 收款账号(微信/支付宝手机号或账号) 'payee_name' => '张三', // 收款人姓名(必须和账号实名一致,否则打款失败) 'transfer_fee' => 1.00, // 代付金额(元) 'transfer_desc' => '字节曜博客佣金结算', // 备注,收款人能看到 'notify_url' => 'https://你的域名/transfer/notify.php', // 代付结果回调地址 'timestamp' => time() ]; // 2. 生成签名 $params['sign'] = XyPayUtil::createSign($params); // 3. 调用代付接口 $url = 'https://pay.ziyeyao.com/api/v2/transfer'; try { $result = XyPayUtil::postRequest($url, $params); // 验签 $sign = $result['sign']; unset($result['sign']); if (!XyPayUtil::verifySign($result, $sign)) { die("签名验证失败"); } // 处理结果 if ($result['code'] == 0) { echo "代付申请提交成功!代付单号:" . $result['out_transfer_no']; } else { die("代付申请失败:" . $result['msg']); } } catch (Exception $e) { die("代付调用失败:" . $e->getMessage()); } ?>6. 回调通知API——最容易踩坑!必看 支付、退款、代付成功后,平台会主动往你的notify_url发POST请求,这步处理不好会重复回调、漏单,分享我实测能用的通用回调代码: PHP回调处理代码(支付/退款/代付通用) <?php require_once 'XyPayUtil.php'; // 1. 获取平台回调的参数(兼容JSON和表单提交) $postData = file_get_contents('php://input'); $params = json_decode($postData, true); if (!$params) { $params = $_POST; // 表单格式兼容 } // 2. 验证签名(重中之重!防止伪造回调) try { $sign = $params['sign']; unset($params['sign']); // 移除sign再验签 if (!XyPayUtil::verifySign($params, $sign)) { die("sign error"); // 签名错,直接返回error } // 3. 按类型处理业务逻辑 $type = $params['type']; // trade=支付,refund=退款,transfer=代付 if ($type == 'trade') { // 支付成功:更新订单状态、开通会员等 $outTradeNo = $params['out_trade_no']; // 你的订单号 $tradeState = $params['trade_state']; if ($tradeState == 'SUCCESS') { // 这里写你的业务代码,比如: // update_order_status($outTradeNo, 'paid'); // 更新订单状态 // open_vip($outTradeNo); // 开通会员 echo "success"; // 必须返回纯字符串success,平台才停止回调 exit; } } elseif ($type == 'refund') { // 退款成功:更新退款订单状态 echo "success"; exit; } elseif ($type == 'transfer') { // 代付成功:更新代付订单状态 echo "success"; exit; } // 不管成功失败,都返回success避免重复回调 echo "success"; } catch (Exception $e) { die("fail"); } ?>回调踩坑提醒: 返回值必须是纯字符串success,不能带HTML、空格、换行,否则平台会每隔1分钟回调一次; 业务逻辑要加“幂等性处理”(比如判断订单是否已处理,避免重复开通会员); 回调接口别设超时,建议把业务逻辑异步处理(比如扔到消息队列),避免平台等待超时。 三、为啥推荐晓翼易支付?实测大半年的真心话 用过不少支付工具,晓翼易支付是我最省心的,尤其适合个人开发者和小团队: 代码真的能直接用!上面的代码我博客一直在用,替换商户号和密钥就能跑,不用自己抠签名、调curl; 功能全还稳定:支付、退款、代付一套接口全cover,不用对接多个平台;服务器是集群部署的,高峰期也没掉过链子,接口响应快; 无门槛+费率低:个人开发者不用营业执照就能开通,新用户还有专属费率(比行业平均低0.2%),省不少手续费; 客服靠谱:遇到问题加客服微信,基本秒回,甚至能远程帮你看代码,比自己查文档省太多时间。 现在我身边不少做博客、小电商、工具类产品的开发者都在用,核心就是“对接简单、用着放心”。如果是PHP开发者,不管是个人变现还是小团队业务,直接冲就行——半小时搞定对接,剩下的时间专心做核心业务,不比抠支付接口香? 最后总结几个实操重点 所有接口的核心是“签名和验签”,通用工具类别改逻辑,只换自己的密钥; 订单号、退款单号、代付单号必须唯一,按“前缀+时间戳+随机数”生成最稳妥; 回调一定要返回纯字符串success,业务逻辑加幂等性处理; 生产环境记得打开SSL校验,密钥别泄露,最好存在配置文件里。 如果对接中遇到问题,直接加我QQ2273962061,能远程帮你看一眼,比自己瞎琢磨省太多时间~