<?php
/**
* 头条小程序对接微信、支付宝支付
* 服务端获取OrderInfo
* tt.pay 文档地址:
* https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/payment/tt-pay
*/
function GetOrderInfo (){
$order_id = $_POST['order_id'];//订单ID
$service = $_POST['service'];//支付类型 1拉起小程序收银台,3微信 API 支付,4支付宝 API 支付
$order = M('order')->where(['id'=>$order_id])->field('id,order_sn,title,money')->find();//订单信息
$orderInfo = [
'merchant_id' => C('BYTE_MERCHANT_ID'),//开发者后台支付设置页的商户号
'app_id' => C('BYTE_APP_ID'),//开发者后台支付设置页的 app_id
'sign_type' => 'MD5',//固定值:MD5。商户生成签名的算法类型
'timestamp' => (string)time(),//发送请求的时间戳,精确到秒
'version' => '2.0',//固定值:2.0
'trade_type' => 'H5',//固定值:H5
//'sign' => '',//签名,具体签名方案见 服务端签名
'product_code' => 'pay',//固定值:pay
'payment_type' => 'direct',//固定值:direct
'out_order_no' => $order['order_sn'],//商户订单号
'uid' => C('BYTE_APP_ID'),//固定值:同 app_id
'total_amount' => $order['money'] * 100,//金额,整型,单位:分(不能有小数)
'currency' => 'CNY',//固定值: CNY。币种
'subject' => $order['title'],//商户订单名称
'body' => $order['title'],//商户订单详情
'trade_time' => (string)time(),//下单时间戳,精确到秒
'valid_time' => '600',//订单有效时间(单位 秒)
'notify_url' => 'https://tp-pay.snssdk.com/paycallback',//固定值:https://tp-pay.snssdk.com/paycallback
//'alipay_url' =>'',//调用支付宝 App 支付所需的支付请求参数
//'wx_url' =>'',//调用微信 H5 支付统一下单接口 返回的 mweb_url 字段值(请注意不要进行 urlencode)。
//'wx_type' =>'',//wx_url 非空时传 'MWEB'。wx_url 为空时,该字段不传
'risk_info' => json_encode(['ip'=>getIP()]),//支付风控参数。序列化后的 JSON 结构字符串,JSON 结构如下:{ip: '用户外网IP'}
];
if($service == 3){
//获取微信H5支付的mweb_url(需自己对接)
$wx_pay_url = get_wx_pay_url($order_id);
$orderInfo['wx_url'] = $wx_pay_url;
$orderInfo['wx_type'] = 'MWEB';
}elseif ($service == 4){
//获取支付宝App支付请求参数(需自己对接)
$ali_pay_url = get_ali_pay_url($order_id);
$orderInfo['alipay_url'] = $ali_pay_url;
}
$orderInfo['sign'] = get_tt_pay_sign($orderInfo,C('BYTE_APP_SECRET'));
return $orderInfo;
}
/**
* @desc 服务端签名
* @param array $orderInfo 签名前的支付数据
* @param string $app_secret 头条支付secret
* @return string 签名结果字符串
*/
function get_tt_pay_sign(array $orderInfo, $app_secret){
//1.去掉请求参数中 sign 与 risk_info 字段、value 为空的字段。
foreach ($orderInfo as $k=>$v){
if($k == 'sign' || $k == 'risk_info' || empty($v)){
unset($orderInfo[$k]);
}
}
//2.把筛选后的 k-v 集合按照 key 的 ASCII 码升序排序
ksort($orderInfo);
//3.k-v 按照 key=value 的格式链接,并且按照 key 排序使用 & 连接成一个字符串,生成待签名字符串
$parts = [];
foreach ($orderInfo as $k => $v) {
$parts[] = $k . '=' . $v;
}
//4.待签名字符串
$unsigned_str = implode('&', $parts);
file_put_contents('unsigned_str.txt',$unsigned_str);//保存一下 支付自助校验时会用到
//5.MD5 加签
$sign = md5($unsigned_str.$app_secret);
return $sign;
}