PHP code example of xing.chen / payment
1. Go to this page and download the library: Download xing.chen/payment library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
xing.chen / payment example snippets
$payName = 'WeChatPay'; // 支付驱动代码
$orderSn = '商家订单号';
$title = '商品名称';
$body = $payName == 'ApplePay' ? '商品id' : '商品名称或商品描述';
// 配置
$set = [...]; // 配置,请参阅配置章节
if (empty($set)) throw new \Exception('读取支付设置失败,payName = ' . $payName);
$payInstance = \xing\payment\drive\PayFactory::getInstance($payName)
->init($set)
->customParams($module)
->set($orderSn, $amount, $title, $body, $intOrderSn);
// 如果是微信JSAPI支付
if ($payName == 'wxMiniProgram') {
$openId = '微信用户openId';
$set['openId'] = $openId;
$orderInfo = $paySign = $payInstance->getMiniProgramParam();
} else { // 其他
$orderInfo = $paySign = $payInstance->getAppParam();
}
try {
$payName = 'AliPay';
$set = PaymentSetMap::getSet($payName);
if (!PayFactory::getInstance($payName)->init($set)->validate($_POST)) throw new \Exception('验证失败');
exit('success');
} catch (\Exception $e) {
exit('fail');
}
$payName = '支付驱动代码'; // 支付驱动代码
$payInstance = \xing\payment\drive\PayFactory::getInstance($payName)->init($confing); //支付驱动 的配置,详情看配置篇,小程序需要在微信支付配置的基础上多加openId
// 小程序、公众号支付等JSAPI需要额外加上用户openId
$confing['openId'] = '用户openId';
// 单个
$sign = $payInstance->set('订单号', '金额', '支付标题(商品名)')->getAppParam();
// 微信小程序、公众号、网页支付等和JSAPI有关的支付生成签名方法为:
$sign = $payInstance->set('订单号', '金额', '支付标题(商品名)')->getMiniProgramParam();
// 同时获取微信和支付的app支付签名
$payChannel= \xing\payment\drive\PayFactory::getAppsParam([
'AliPay' => $aliConfig,
'WeChatPay' => $wechatConfig
], '订单号', '金额', '支付标题(商品名)');
// 如无特别说明,传递的参数都是是$_POST,但有些支付厂商不能使用$_POST,如paypal,微信等,请参考获取异步通知参数说明
if (!$payInstance->validate($_POST))
throw new \Exception('非法请求');
$payInstance->set('订单号', '退款金额')->refund();
$payInstance->set('订单号', '退款金额', '退款原因', '', '多次退款唯一标识单号')->refund();
$payInstance->customParams('自定义参数(字符串)');
$appleSet = [
'sandbox' => false, // 是否沙箱模式
'secret' => 'app专用共享密钥',
];
$orderInfo = $payInstance->set('订单号', '金额', '', '产品id')->getAppParam();
// 支付宝配置
$aliConfig = [
'title' => '支付宝支付',
'appId' => '支付宝appId',
'notifyUrl' => '异步通知 url',
'alipayrsaPublicKey' => '支付宝公钥(字符串),详情请查看支付宝生成公钥的文档',
'rsaPrivateKey' => '支付宝私钥(字符串),详情请查看支付宝生成私钥的文档',
];
$params = $_POST['passback_params']; // 自定义参数
$orderSn = $_POST['out_trade_no']; // 订单号
$payMoney = $_POST['total_amount']; // 支付金额
// 微信
$wechatConfig = [
'title' => '微信支付',
'appId' => '微信支付appId',
'mchId' => '商户id',
'notifyUrl' => '异步通知 url',
// 请换成你自己的相应的文证书件地址
'SSL_CERT_PATH' => '(绝对路径)apiclient_cert.pem',
'SSL_KEY_PATH' => '(绝对路径)apiclient_key.pem',
];
# 获取微信异步通知传来的参数
$post = $payInstance->getNotifyParams();
# 这是自定义参数
$drive = $post['attach'] ?? '';
# 订单号
$orderSn = $post['out_trade_no'];
# 获取微信异步通知传来的参数
$post = $payInstance->getNotifyParams();
# 获取和订单一致的支付金额(将分转为元)
$payMoney = $payInstance->centsToYuan($post['total_fee']);
$config = [
'merchant_id' => '商户号',
'app_id' => 'appId',
'secret' => '密钥',
];
// 传入支付宝或微信驱动代码,返回的数据就会包含alipay_url或wx_url相关参数
$orderInfo = $payInstance->setService('AliPay或WeChatPay')->getAppParam();
$config = [
'clientId' => '商家id',
'clientSecret' => 'Secret',
'sandbox' => false, // 是否开启沙箱模式
];
$requestBody = file_get_contents('php://input');
$set = [
'apiKey' => 'apiKey',
'secretKey' => 'secretKey'
];
$test = true; // 是否测试环境
$config = [
// 配置和证书的路径
'certsPath' => dirname(__DIR__) . '/config/certs'.(!$test ? '' : '_test').'/',
'merId' => $test ? 777290058110048 : '商户号',
];
/**
* certsPath文件说明:
* 以下文件当你和银联那边对接通之后,他们的资源包会包含以下文件,除了复制到程序里之外,你还需要根据银联的教程将部分文件配置好。
*
* 生产环境 certsPath 应包含的文件
* config/certs/acp_prod_enc.cer
* config/certs/acp_prod_middle.cer
* config/certs/acp_prod_root.cer
* config/certs/acp_sdk.ini
* config/certs/cfca.cer
* config/certs/cfca.pfx
*
*
* 测试环境 certsPath 应包含的文件
* config/certs_test/acp_sdk.ini
* config/certs_test/acp_test_enc.cer
* config/certs_test/acp_test_middle.cer
* config/certs_test/acp_test_root.cer
* config/certs_test/acp_test_sign.pfx
*/
$orderSn = '订单号';
$payMoney = '支付金额/单位分';
try {
$tn = $payInstance->createOrder($orderSn, $payMoney);
} catch (\Exception $e) {
throw $e;
}
$conifg = [
'apiKey' => 'apiKey',
'checkValidate' => 'md5', // 验证方式
'pemPath' => '证书路径',
];
try {
$orderSn = $_REQUEST['v_oid'] ?? '';
if (empty($orderSn)) throw new \Exception('订单号没有获取到');
if($payInstance->validate($_REQUEST)) {
$count = $_REQUEST['v_count'] ?? 0;//订单个数
if ($count <= 0) throw new \Exception('订单个数小于0');
$v_oid=$_REQUEST['v_oid'];//订单编号组
$v_pstatus=$_REQUEST['v_pstatus'];//支付状态组
$v_amount=$_REQUEST['v_amount'];//订单支付金额
$v_moneytype=$_REQUEST['v_moneytype'];//订单支付币种
$sp = '|_|';
$a_oid = explode($sp, $v_oid);
$a_pstatus = explode($sp, $v_pstatus);
$a_amount = explode($sp, $v_amount);
// 通知可能包含多个订单通知,所以循环
for ($i = 0; $i < $count; $i++) {
$orderSn = preg_replace('/(.*)-/', '', $a_oid[$i]);
if($a_pstatus[$i]=='1')
{
// 支付成功,业务代码
}
}
exit('success');
} else {
throw new \Exception('验证订单失败');
}
} catch(\Exception $e) {
throw $e;
}