我辞职不干互联网了,所以一些配置就没了,但是还会留意 issues(有邮件等通知)。有想维护这个 SDK 的小伙伴可以提交对应仓库的 PR。
| 第三方 | token | openid | 支付 | 回调 | 退款 | 订单查询 | 手机号 | 分账 | 模版消息 | 仓库 |
|---|---|---|---|---|---|---|---|---|---|---|
| 微信小程序 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | x | ✓ | 地址 |
| 百度小程序 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | x | ✓ | 地址 |
| 抖音小程序 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 地址 |
| 快手小程序 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | x | 地址 |
| 支付宝小程序 | x | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | x | ✓ | 地址 |
| 微信 h5 | x | x | ✓ | ✓ | ✓ | ✓ | x | x | x | 地址 |
| 微信 APP | x | ✓ | ✓ | ✓ | ✓ | ✓ | x | x | x | 地址 |
| 微信公众号 | x | x | ✓ | ✓ | ✓ | ✓ | x | x | ✓ | 地址 |
composer require code-lives/applet-pays 5.9金额单位分 100=1 元
微信支付未使用 APIv3 接口规则
获取 openid 接口 统一 openid 字段(因快手返回的 open_id)
返回结果 array 由开发者自行判断
抖音小程序由字节小程序转变而来,支持多端(头条、抖音、今日头条等关联应用)
// 第一种使用方法 Factory:: ide 自动提示 Weixin
$pay= \Applet\Pay\Factory::Weixin()->init($config)->set("订单号","金额","描述")->getParam();
// 第二种方法
$PayName='Baidu';//百度
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述")->getParam();
$PayName='Byte';//抖音
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述","描述")->getParam();
$PayName='Weixin';//微信
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述","openid")->getParam();
$PayName='Kuaishou';//快手
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述",'openid', 'access_token')->getParam();
$PayName='Ali';//支付宝小程序
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述",'openid')->getParam();
$PayName='Weixin';//微信公众号【appid 和secret 换成公众号的】
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述","openid")->getParam();
$PayName='Weixin';//微信H5【appid 和secret 换成公众号的】
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述")->getH5Param();
$PayName='Weixin';//微信APP (没有openid)
$pay= \Applet\Pay\Factory::getInstance($PayName)->init($config)->set("订单号","金额","描述")->getParam();| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| appkey | string | 是 | 百度小程序 appkey |
| payappKey | string | 是 | 百度小程序支付 appkey |
| appSecret | string | 是 | 百度小程序 aapSecret |
| dealId | int | 是 | 百度小程序支付凭证 |
| isSkipAudit | int | 是 | 默认为 0; 0:不跳过开发者业务方审核;1:跳过开发者业务方审核。 |
| rsaPriKeyStr | string | 是 | 私钥(只需要一行长串,不需要文件) |
| rsaPubKeyStr | string | 是 | 百度小程序支付的平台公钥(支付回调需要) |
| notifyUrl | string | 否 | 异步回调地址 |
| refundNotifyUrl | string | 否 | 退款异步回调地址 |
$PayName='Baidu';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getToken();| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| expires_in | string | 是 | 凭证有效时间,单位:秒 |
| session_key | string | 是 | session_key |
| access_token | string | 是 | 获取到的凭证 |
$PayName='Baidu';//设置驱动
$code="";
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getOpenid($code);| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| session_key | string | 是 | session_key |
| openid | string | 是 | 用户 openid |
$PayName='Baidu';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->decryptPhone($session_key, $iv, $ciphertext);
echo $phone['mobile'];| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| access_token | string | 是 | 根据上面的获取 token |
| tpOrderId | string | 是 | 平台订单号 |
$PayName='Baidu';//设置驱动
$Baidu = \Applet\Pay\Factory::getInstance('Baidu')->init($config);
$order = [
'tpOrderId' => '',//订单号
'access_token' => $Baidu->getToken()['access_token'],
];
$data = $Baidu->findOrder($order);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| access_token | string | 是 | 根据上面的获取 token |
| bizRefundBatchId | int | 是 | 百度平台的订单号 |
| isSkipAudit | int | 是 | 默认为 0; 0:不跳过开发者业务方审核;1:跳过开发者业务方审核。 |
| orderId | int | 是 | 百度平台的订单号 |
| refundReason | string | 是 | 退款描述 |
| refundType | int | 是 | 退款类型 1:用户发起退款;2:开发者业务方客服退款;3:开发者服务异常退款。百度小程序支付的平台公钥 |
| tpOrderId | string | 是 | 自己平台订单号 |
| userId | int | 是 | 用户 uid(不是自己平台 uid) |
$order = [
'token' => 'abcd',
'bizRefundBatchId' => 123456,//百度平台订单号
'isSkipAudit' => 1,
'orderId' => 123456,
'refundReason' => '测试退款',
'refundType' => 2,//
'tpOrderId' => '123',//自己平台订单号
'userId' => 123,
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->applyOrderRefund($order);$data = [
"touser_openId" => "",
"template_id" => "",
"page" => "pages/index/index",
"subscribe_id" => '百度from组件subscribe-id 一致',
"data" => json_encode([
'keyword1' => ['value' => "第一个参数"],
'keyword2' => ['value' => "第二个参数"],
'keyword3' => ['value' => "第三个参数"],
])
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->sendMsg($data,$token);
$data=[
"errno" => 0,
"msg" => "success",
"data" => array=> [
"msg_key" => 1663314134696897
]
]| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| token | string | 是 | 担保交易回调的 Token(令牌) |
| salt | string | 是 | 担保交易的 SALT |
| merchant_id | string | 是 | 担保交易的商户号 |
| app_id | int | 是 | 小程序的 APP_ID |
| secret | string | 是 | 小程序的 APP_SECRET |
| notify_url | string | 是 | 支付回调 url |
| settle_url | string | 否 | 分账回调 url,没有默认支付回调 url |
$PayName='Byte';//驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getToken();| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| expires_in | string | 是 | 凭证有效时间,单位:秒 |
| access_token | string | 是 | 获取到的凭证 |
$PayName='Byte';//设置驱动
$code="";
$anonymous_code="";//可以不传
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getOpenid($code,$anonymous_code);| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| session_key | string | 是 | session_key |
| openid | string | 是 | 用户 openid |
| unionid | string | 是 | unionid |
$PayName='Baidu';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->decryptPhone($session_key, $iv, $encryptedData);
echo $phone['phoneNumber'];$PayName='Byte';//设置驱动
$Baidu = \Applet\Pay\Factory::getInstance($payName)->init($config);
$data = $Baidu->findOrder("订单号");| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_order_no | string | 是 | 平台订单号 |
| out_settle_no | string | 是 | 自定义订单号 |
| settle_desc | int | 是 | 分账描述 |
| cp_extra | string | 是 | 开发者自定义字段,回调原样回传 |
$PayName='Byte';//设置驱动
$Baidu = \Applet\Pay\Factory::getInstance($payName)->init($config);
$data = $Baidu->settle($order);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_order_no | string | 是 | 平台订单号 |
| out_refund_no | int | 是 | 自定义订单号 |
| reason | int | 是 | 退款说明 |
| refund_amount | string | 是 | 退款金额 |
$order = [
'out_order_no' => '',
'out_refund_no' => time() . 'refund',
'reason' => '就想退款,咋滴',
'refund_amount' => 1, //退款金额
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->applyOrderRefund($order);
//返回 [err_no] => 1
// [err_tips] => 成功
// [refund_no] => 1212$data = [
'tpl_id' => "模版id",
"open_id" => $parm['openid'],
'data' => [
'律师' => "张三",
"回复时间" => date('Y-m-d H:i:s', time()),
"回复内容" => "我回复你啦",
],
"page" => "pages/index/index",
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->sendMsg($data,$token);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| appid | int | 是 | 小程序 appid |
| secret | int | 是 | 小程序 secret |
| mch_id | string | 是 | 商户 mch_id |
| mch_key | string | 是 | 商户 mch_key |
| notify_url | string | 是 | 异步地址 |
| cert_pem | string | 是 | cert_pem 证书 |
| key_pem | string | 是 | key_pem 证书 |
| trade_type | string | 是 | 默认为:JSAPI。MWEB:代表微信 H5 、JSAPI:公众号或小程序 |
$PayName='Weixin';//驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getToken();| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| expires_in | string | 是 | 凭证有效时间,单位:秒 |
| access_token | string | 是 | 获取到的凭证 |
$PayName='Weixin';//设置驱动
$code="";
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getOpenid($code);| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| session_key | string | 是 | session_key |
| openid | string | 是 | 用户 openid |
| unionid | string | 是 | unionid |
$PayName='Weixin';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->decryptPhone($session_key, $iv, $encryptedData);
echo $phone['phoneNumber'];$PayName='Weixin';//设置驱动
$Baidu = \Applet\Pay\Factory::getInstance($payName)->init($config);
$data = $Baidu->findOrder("订单号");| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_trade_no | string | 是 | 平台订单号 |
| out_refund_no | string | 是 | 自定义订单号 |
| refund_fee | int | 是 | 退款金额 |
| total_fee | int | 是 | 订单金额 |
| refund_desc | string | 是 | 退款原因 |
$order = [
'out_trade_no' => '123',
'total_fee' => 0.01,
'out_refund_no' => time(),
'refund_fee' => 0.01,
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->applyOrderRefund($order);$data = [
"touser" => "",
"template_id" => "",
"page" => "pages/index/index",
"miniprogram_state" => "developer",
"lang" => "zh_CN",
"data" => [
'thing6' => ['value' => "第一个参数{{thing6.DATA}}"],
'thing7' => ['value' => "第二个参数{{thing7.DATA}}"],
'time8' => ['value' => "第三个参数{{time8.DATA}}"],
],
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->sendMsg($data,$token);
$data=[
"errcode" => 0
"errmsg" => "ok"
"msgid" => 123456
]使用密钥进行签名解密,没有使用证书签名解密。
订单查询、退款、参数设置可以设置其他,具体看文档。
返回值 看官方文档,每个返回值都不一样,自行判断,如 openid 返回[alipay_system_oauth_token_response] 退款返回[alipay_trade_create_response]
| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| appid | string | 是 | 小程序 appid |
| secret | string | 是 | 小程序 AES 用于手机号解密 |
| privateKey | string | 是 | 应用私钥(开发工具生成) |
| publicKey | string | 是 | 支付宝公钥(支付宝后台下载) |
| notify_url | string | 是 | 异步回调地址 |
getOpenid 获取支付宝的用户 user_id 类似于微信的 openid
$PayName='Ali';//设置驱动
$code="";
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getOpenid($code);
//返回参数
$data = array(
[alipay_system_oauth_token_response] => Array
(
[access_token] => 123
[alipay_user_id] => 123
[auth_start] => 2023-03-26 20:56:36
[expires_in] => 1296000
[re_expires_in] => 2592000
[refresh_token] => auth
[user_id] => 123
)
[sign] =>
)$PayName='Ali';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->decryptPhone($session_key, $iv, $encryptedData);
echo $phone['mobile'];$PayName='Ali';//设置驱动
$Baidu = \Applet\Pay\Factory::getInstance($payName)->init($config);
$data = $Baidu->findOrder(['out_trade_no' => '1679838318']);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_trade_no | string | 是 | 平台订单号 |
| refund_amount | int | 是 | 退款金额 |
$orders = [
'out_order_no' => $order['out_order_no'],
'refund_amount' => $order['refund_amount'],
];
$PayName='Ali';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->applyOrderRefund($order);模版消息设置比较麻烦。需要先到开发平台添加进入小程序进行产品绑定,在去商家平台设置文档
$data = [
'to_user_id' => '用户uid',
'user_template_id' => '模版id',
'page' => 'pages/index/index',
'data' => json_encode([
'keyword1' => ['value' => '1'],
'keyword2' => ['value' => '2'],
'keyword3' => ['value' => '3'],
]),
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->sendMsg($data,$token);$PayName='Kuaishou';//设置驱动
$code="";
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getToken();| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| app_id | int | 是 | 小程序 appid |
| app_secret | int | 是 | 小程序 secret |
| notify_url | string | 是 | 回调地址 |
| settle_url | string | 是 | 结算回调地址,没有就默认 notify_url |
| type | int | 是 | 类目 |
$PayName='Kuaishou';//设置驱动
$code="";
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->getOpenid($code);| 返回参数 | 类型 | 必须 | 说明 |
|---|---|---|---|
| session_key | string | 是 | session_key |
| openid | string | 是 | 用户 open_id |
| result | string | 是 | 状态 1 是成功 |
$PayName='Kuaishou';//设置驱动
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->decryptPhone($session_key, $iv, $encryptedData);
echo $phone['phoneNumber'];$PayName='Kuaishou';//设置驱动
$Baidu = \Applet\Pay\Factory::getInstance($payName)->init($config);
$data = $Baidu->findOrder("订单号",$access_token);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_trade_no | string | 是 | 平台订单号 |
| out_refund_no | strging | 是 | 自定义订单号 |
| refund_amount | int | 是 | 退款金额 |
| reason | string | 是 | 退款原因 |
| access_token | string | 是 | access_token |
| attach | string | 否 | 自定义 |
$orders = [
'out_order_no' => $order['out_order_no'],
'out_refund_no' => $order['out_refund_no'],
'reason' => $order['reason'],
'attach' => $order['attach'],
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->applyOrderRefund($order);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_order_no | string | 是 | 平台订单号 |
| out_settle_no | string | 是 | 自定义订单号 |
| reason | string | 是 | 退款原因 |
| access_token | string | 是 | access_token |
| attach | string | 否 | 自定义 |
//注意 需要设置回调 notify_url 在config 设置 settle_url 如果没有 默认为 notify_url
$orders = [
'out_order_no' => $order['out_order_no'],
'out_settle_no' => $order['out_settle_no'],
'reason' => $order['reason'],
'attach' => $order['attach'],
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->settle($order,$access_token);| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| out_biz_order_no | string | 是 | 展示在用户端的唯一订单号 |
| out_order_no | string | 是 | 小程序预下单支付订单号 |
| open_id | string | 是 | 订单对应的用户 open id |
| order_create_time | string | 是 | 订单创建时间 |
| order_status | string | 否 | 订单状态 |
| order_path | string | 是 | 小程序路径 |
| product_cover_img_id | string | 是 | 图片 id |
$order = [
'out_biz_order_no' => '',
'out_order_no' => '',
'open_id' => '',
'order_create_time' => time(),
'order_status' => 6,
'order_path' => '',
'product_cover_img_id' =>'',
];
$data = \Applet\Pay\Factory::getInstance($PayName)->init($config)->synchronousOrder($order, $token);$data = \Applet\Pay\Factory::getInstance($PayName)->init($config)->imgUpload('图片路径', $token);$data = [
"open_id" => "",
"tpl_id" => "",
"page" => "pages/index/index",
"data" => [
'key1' => "第一个",
'key2' => "第二个",
'key3' => "第三个",
]
];
$data= \Applet\Pay\Factory::getInstance($PayName)->init($config)->sendMsg($data,$token);
$data=[
"err_no" => 1001,
"err_tips" => "该用户未订阅"
]| 参数名字 | 类型 | 必须 | 说明 |
|---|---|---|---|
| appid | int | 是 | 开发平台 appid |
| secret | int | 是 | 开放平台 secret |
| mch_id | string | 是 | 商户 mch_id |
| mch_key | string | 是 | 商户 mch_key |
| trade_type | string | 是 | APP |
| notify_url | string | 是 | 异步地址 |
$pay = \Applet\Pay\Factory::getInstance('Byte')->init($config);
$status = $pay->notifyCheck(); //验证
if ($status) {
$orderSn = $pay->getNotifyOrder(); //订单数据$orderSn['msg']['cp_orderno'] $orderSn['msg']['seller_uid']
switch ($orderSn['type']) {
case 'payment': // 支付相关回调
/**
*业务处理
*/
echo json_encode(['err_no' => 0, 'err_tips' => 'success']);exit; // 操作成功需要给头条返回的信息
break;
case 'refund': // 退款相关回调
/**
*业务处理
*/
echo json_encode(['err_no' => 0, 'err_tips' => 'success']);exit; // 操作成功需要给头条返回的信息
break;
case 'settle': // 分账相关回调
/**
*业务处理
*/
echo json_encode(['err_no' => 0, 'err_tips' => 'success']);exit; // 操作成功需要给头条返回的信息
break;
default: // 未知数据
return '数据异常';
}
}$pay = \Applet\Pay\Factory::getInstance('Weixin')->init($config);
$status = $pay->notifyCheck();//验证
if($status){
$order = $pay->getNotifyOrder();//订单数据
//$order['out_trade_no']//平台订单号
//$order['transaction_id']//微信订单号
echo 'success';exit;
}$pay = \Applet\Pay\Factory::getInstance('Baidu')->init($config);
$status = $pay->notifyCheck();//验证
if($status){
$order = $pay->getNotifyOrder();
//$order['tpOrderId']
//$order['orderId']
//$order['userId']
echo 'success';exit;
}$pay = \Applet\Pay\Factory::getInstance('Kuaishou')->init($config);
$status = $pay->notifyCheck(); //验证
if ($status) {
$order = $pay->getNotifyOrder(); //订单数据
//$order['data']['out_order_no']//平台订单号
echo json_encode(['result' => 1, 'message_id' => $order['message_id']]);exit;
}$pay = \Applet\Pay\Factory::getInstance('Ali')->init($config);
$status = $pay->notifyCheck(); //验证
if ($status) {
$order = $pay->getNotifyOrder(); //订单数据
//$order['out_trade_no']//平台订单号
}