开通支付就不做说明了,请直接查看官方文档:https://microapp.bytedance.com/dev/cn/mini-app/develop/open-capacity/payment/mini-app-pay-plugin-reference/application-for-payment
具体看文档:https://microapp.bytedance.com/dev/cn/mini-app/develop/open-capacity/payment/tt.pay
// 支付
run_pay(){
let service_val = 3; // 1 收银台 3 微信 4 支付宝
qrxs.get_fetch('https://api.*****.com/pay/pay.html', {'fee':1800,'service':service_val ,'openid':'N2****Xu'}, function (data) {
let orderInfo = data.data;
if (data.status === "success") {
tt.pay({
orderInfo: orderInfo,
service: service_val,
getOrderStatus(res) {
let { out_order_no } = res;
return new Promise(function(resolve, reject) {
// 商户前端根据 out_order_no 请求商户后端查询微信支付订单状态
tt.request({
url: "" ,
success(res) {
// 商户后端查询的微信支付状态,通知收银台支付结果
resolve({ code: 0 | 1 | 2 | 3 | 9 });
},
fail(err) {
reject(err);
}
});
});
},
success(res) {
console.log(res)
if (res.code == 0) {
// 支付成功处理逻辑,只有res.code=0时,才表示支付成功
// 但是最终状态要以商户后端结果为准
}
},
fail(res) {
console.log(res)
// 调起收银台失败处理逻辑
}
});
}
})
},
/**
* 网络请求
* @param options
* @return {Promise}
*/
var get_fetch = function (url, data, backFun, method = 'GET') {
let that = this;
let headerJson = {
"QRXS-FROM":'xcx'
};
tt.request({
url: url,
data: data,
header: headerJson,
method: method,
success: function (ret) {
try {
// console.log(ret.data);
backFun(ret.data);
} catch (error) {
console.log(error);
}
},
fail: function (msg, code) {
console.log(code);
console.log(msg);
},
complete: function () {
}
})
}
小程序代码就不做过多的说明了
/**
* 今日头条小程序支付
* @param array $data 订单数据 body、 total_amount ,out_trade_no 必须要
* @param string $openid 字节跳动的openid
* @param int $service 1 拉起小程序收银台 3 微信支付 4 支付宝支付
* @param int $payid 后台支付商户命名,区分cps和自有
* @return array
*/
function creParamToutiao($data=[],$openid='N2**aXu',$service=1){
$body = isset($data['body']) ? $data['body'] : '订单说明';
$total_amount = isset($data['total_amount']) ? $data['total_amount'] : 0; // 订单金额 分
$out_trade_no = isset($data['out_trade_no']) ? $data['out_trade_no'] : '订单号';
$now = time();
$risk_info = get_client_ip(); //获取用户真实IP(我在这里写了一个获取IP的方法)
$app_secret = 'u********xe'; //头条支付分配给业务方的支付秘钥
$data = [
"merchant_id" => "19*****42", // 头条支付分配给商户的商户号
'app_id' => "8******2", // 头条支付分配给商户 app_id,用于获取加签秘钥信息。
'sign_type' => "MD5", // 固定值:MD5。商户生成签名的算法类型
"timestamp" => $now, // 发送请求的时间戳,精确到秒
"version" => "2.0", // 固定值:2.0
"trade_type" => "H5", // 固定值:H5
"product_code" => "pay", // 固定值:pay
"payment_type" => "direct", // 固定值:direct
"currency" => "CNY", // 固定值: CNY。币种
"total_amount" => $total_amount, // 金额,整型,单位:分(不能有小数)
'out_order_no' => $out_trade_no, // 商户订单号
"uid" => $openid, // 用户在商户侧唯一标志,长度:32 位
"subject" => $body, // 商户订单名称;
"body" => $body, // 商户订单详情
"trade_time" => $now, // 下单时间戳,精确到秒
"valid_time" => "300", // 订单有效时间(单位 秒)
"notify_url" => "https://api.****.com/pay/pay.html", // 回调地址
'wx_url' => '', // 调用微信 H5 支付统一下单接口 返回的 mweb_url 字段值(请注意不要进行 urlencode)。 service=3 时必传
'wx_type' => '', // wx_url 非空时传 'MWEB'。wx_url 为空时,该字段不传
'alipay_url' => '', // 调用支付宝 App 支付所需的支付请求参数 service=4 时必传
];
// 说明:service=3|4 时,merchant_id, app_id, sign_type, sign, wx_url, alipay_url, wx_type 字段值必须是真实信息;
// 其他字段传非空、符合格式要求内容即可,不强制要求是真实订单信息
if($service == 3){ // 微信
$wxDataArr = $this->cre_param_wxH5($total_amount,$body,$out_trade_no);
$data["wx_url"] = isset($wxDataArr['mweb_url']) ? $wxDataArr['mweb_url'] : ''; // 调用微信 H5 支付统一下单接口 返回的 mweb_url 字段值(请注意不要进行 urlencode)。 service=3 时必传
$data["wx_type"] = 'MWEB'; // wx_url 非空时传 'MWEB'。wx_url 为空时,该字段不传
$data['notify_url'] = isset($wxDataArr['notify_url']) ? $wxDataArr['notify_url'] : '';
}
if($service == 4){ // 支付宝
$alipayArr = $this->cre_param_alipay($total_amount,$body,$out_trade_no);
$alipayStr = isset($alipayArr['alipayStr']) ? $alipayArr['alipayStr'] : '';
$data['notify_url'] = isset($alipayArr['notify_url']) ? $alipayArr['notify_url'] : '';
$data["alipay_url"] = $alipayStr; // 调用支付宝 App 支付所需的支付请求参数 service=4 时必传
}
$data["sign"] = $this->getSignContent($data , $app_secret); //这里写了一个签名的方法
$data["risk_info"] = json_encode(['ip' => $risk_info]); // // 支付风控参数。序列化后的 JSON 结构字符串,JSON 结构如下:{ip: '用户外网IP'}
return $data;
}
/**
* 字节跳动签名处理
* @param $params
* @param $charset
* @return string
*/
public function getSignContent($params , $app_secret='', $charset='UTF-8') {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if(!isset($v) || $v === null || trim($v) === "" || "@" == substr($v, 0, 1)){
continue;
}
// 转换成目标字符集
if (!empty($v)) {
$fileType = "UTF-8";
if (strcasecmp($fileType, $charset) != 0) {
$v = mb_convert_encoding($v, $charset, $fileType);
}
}
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
unset ($k, $v);
return md5($stringToBeSigned.$app_secret);
}
/**
* 支付宝支付
* @param int $total_amount 订单金额(分)
* @param string $body 订单说明
* @param string $out_trade_no // 订单号
* @return array
*/
function cre_param_alipay($total_amount=0,$body='',$out_trade_no=''){
// 进公帐
$version_path = 'qrxs_alipay_cert_new';
$alipayconf = [
'partner' => '*****', //合作者身份id
'app_id' => '*****', //appid
'seller_id' => '*****', //卖家账号
];
$notify_url = '/notify/alipay_new'; // 回调地址
// 支付宝开始
$total_fee_alip = $total_amount/100;
$biz_content = [
"timeout_express"=>"30m",
"product_code"=>"QUICK_MSECURITY_PAY",
"total_amount"=>"{$total_fee_alip}",
"subject"=>"{$body}",
"body"=>"{$body}",
"out_trade_no"=>"{$out_trade_no}",
];
$biz_content = json_encode($biz_content);
$private_key_path = (getcwd()).'/'.$version_path . '/rsa_private_key.pem';
$alipayParam = array(
'charset'=>'utf-8',
'biz_content'=>$biz_content,
'method'=>'alipay.trade.app.pay', // 接口名称
'notify_url'=>$this->notify_host.$notify_url, //支付完成通知地址
'app_id'=>$alipayconf['app_id'], //合作者身份id
'sign_type'=>'RSA2',
'version'=>'1.0',
'timestamp'=>date('Y-m-d H:i:s'),
);
$alipayStr = $this->getParamSign($alipayParam,$private_key_path);
$backData = [
'alipayStr'=>$alipayStr ,
'notify_url' =>$alipayParam['notify_url'],
];
return $backData;
}
//支付宝参数签名
private function getParamSign($params = array(),$private_key_path=''){
$tempEncode = "";
foreach ($params as $k => $v){
$tempEncode .= $k . '=' . urlencode($v) . '&';
}
$tempEncode = substr($tempEncode, 0, strlen($tempEncode)-1);
if(get_magic_quotes_gpc()){
$tempEncode = stripslashes($tempEncode);
}
// 签名
ksort($params);
$temp = "";
foreach ($params as $k => $v){
$temp .= $k . '=' . $v . '&';
}
$temp = substr($temp, 0, strlen($temp)-1);
if(get_magic_quotes_gpc()){
$temp = stripslashes($temp);
}
//支付宝RSA签名
$priKey = file_get_contents($private_key_path);
$res = openssl_get_privatekey($priKey);
openssl_sign($temp, $sign, $res,OPENSSL_ALGO_SHA256);
openssl_free_key($res);
$sign = base64_encode($sign); //base64编码
return $tempEncode.'&sign='.urlencode($sign);
}
/**
* 微信H5支付
* @param int $total_amount
* @param string $body
* @param string $out_trade_no
* @param int $payid
* @return array
*/
function cre_param_wxH5($total_amount=0,$body='',$out_trade_no=''){
//使用统一支付接口
$notify_url = $this->notify_host."/Notify/wx_h5_own.html";
include_once "Application/Vendor/WxPayH5/WxPayPubHelper.php";
$unifiedOrder = new \UnifiedOrder_pub();
$unifiedOrder->setParameter("body","{$body}");//商品描述
//自定义订单号,此处仅作举例
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
//转分
$unifiedOrder->setParameter("total_fee","$total_amount");//总金额
$unifiedOrder->setParameter("notify_url",$notify_url);//通知地址
$unifiedOrder->setParameter("trade_type","MWEB");//交易类型 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP,,H5支付固定传MWEB
$result = $unifiedOrder->getResult();
$mweb_url = $result['mweb_url'];
$prepayid = $result['prepay_id'];
$data = array(
"mweb_url"=>$mweb_url,
'prepayid'=>$prepayid,
'out_trade_no'=>$out_trade_no,
'notify_url'=>$notify_url,
);
return $data;
}
支付回调就不写了,支付宝 和微信h5支付的回调应该都比较熟悉了,回调都是一样的
//支付宝支付回调接口 3.1.0新账号
public function alipay_new(){
$this->alipay_config = array(
'partner'=> '*****', //合作者身份id
'private_key_path'=>(getcwd()).'/qrxs_alipay_cert_new/rsa_private_key.pem',
'ali_public_key_path'=>(getcwd()).'/qrxs_alipay_cert_new/alipay_public_key.pem',
'cacert' => (getcwd()).'/qrxs_alipay_cert_new/cacert.pem',
'sign_type' => '0001',
'input_charset' => 'utf-8',
'transport' => 'http',
'seller_id' => '*****', //卖家账号
'notify_url' => '', // 回调域名
);
require_once LIB_PATH."/Event/alipay/alipay_notify_app.class.php";
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($this->alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
// 逻辑处理
echo "success";
} else {
echo "fail";
}
}
支付宝回调引用类:https://download.csdn.net/download/qq_23564667/12264188
/*
* 微信h5 回调 cps
* */
public function wx_h5_cps(){
//使用通用通知接口
include_once "Application/Xcx4/Vendor/WxPayH5/WxPayPubHelper.php";
$notify = new \Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);
//验证签名,并回应微信。
if($notify->checkSign() == FALSE){
$notify->setReturnParameter("return_code","FAIL");//返回状态码
$notify->setReturnParameter("return_msg","签名失败");//返回信息
}else{
$notify->setReturnParameter("return_code","SUCCESS");//设置返回码
}
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
if($notify->checkSign() == TRUE)
{
$out_trade_no = $notify->data["out_trade_no"];//订单号
$trade_no = $notify->data["transaction_id"];//微信支付订单号
$result_code = $notify->data["result_code"];//业务结果
$bank_type = $notify->data["bank_type"];//付款银行
$is_subscribe = $notify->data["is_subscribe"];//是否关注公众号
$openid = $notify->data["openid"];
///支付成功 业务逻辑操作
echo ' ';
}
echo ' ';
}
微信回调引用类:https://download.csdn.net/download/qq_23564667/12264153