吐槽一下字节跳动emmmm(口吐芬芳)文档写的emmmm(口吐芬芳)
而且没有PHP的demo,整的琢磨了好久
话不多说,上教程
1.去支付宝申请app支付
2.签约好到支付宝开发平台,进行公钥私钥的配置**(ps:选RSA加密,尽量用openssl,但是放到支付宝公钥和私钥记得去掉前后缀,用支付宝提供的工具也可以,这个可以直接粘贴到公钥私钥配置,但是后面再后面文件读取要加上)**
3.到抖音小程序里申请支付
/**
* 小程序支付
* @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
*/
public function activitybuy($service=1){
$data=[];
$openid=$this->request->post('openid');
$body = isset($data['body']) ? $data['body'] : '订单说明';
$total_amount = isset($data['total_amount']) ? $data['total_amount'] : 1; // 订单金额 分
$data['money'] = $total_amount/100;
$data['openid']= $openid;
$orderid=Db::name('order')->insertGetId($data);
$out_trade_no = isset($data['out_trade_no']) ? $data['out_trade_no'] : $orderid;
$now = time();
$risk_info = $this->request->ip(); //获取用户真实IP(我在这里写了一个获取IP的方法)
$app_secret = 'jy0******************88f'; //头条支付分配给业务方的支付秘钥
$data = [
"merchant_id" => "1******************7", // 头条支付分配给商户的商户号
'app_id' => "8******************0", // 头条支付分配给商户 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://******************.com/pay/pay", // 回调地址
'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,$openid);
// dump($alipayArr);
$alipayStr = isset($alipayArr['alipayStr']) ? $alipayArr['alipayStr'] : '';
$data['notify_url'] = isset($alipayArr['notify_url']) ? $alipayArr['notify_url'] : '';
$data["alipay_url"] = $alipayStr; // 调用支付宝 App 支付所需的支付请求参数 service=4 时必传
}
// dump("11111");
$data["sign"] = $this->getSignContent($data,$app_secret); //这里写了一个签名的方法
$data["risk_info"] = json_encode(['ip' => $risk_info]); // // 支付风控参数。序列化后的 JSON 结构字符串,JSON 结构如下:{ip: '用户外网IP'}
// dump($data);
//请求服务端支付接口
// $res =json_decode(http_request($data,'https://tp-pay.snssdk.com/gateway'),true);
Common::outJson('1000','success',$data);
}
/**
* 签名处理
* @param $params
* @param $charset
* @return string
*/
public function getSignContents($params , $charset,$app_secret) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
// 转换成目标字符集
$v = $this->characet($v, $charset);
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
$stringToBeSigned = $stringToBeSigned.$app_secret;
unset ($k, $v);
return $stringToBeSigned;
}
/**
* 校验$value是否非空
* @param $value
* @return boolean;
* if not set ,return true;
* if is null , return true;
**/
public function checkEmpty($value) {
if (!isset($value))
return true;
if ($value === null)
return true;
if (trim($value) === "")
return true;
return false;
}
/**
* 转换字符集编码
* @param $data
* @param $targetCharset
* @return string
*/
public function characet($data, $targetCharset) {
if (!empty($data)) {
$fileType = "UTF-8";
if (strcasecmp($fileType, $targetCharset) != 0) {
$data = mb_convert_encoding($data, $targetCharset, $fileType);
}
}
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
*/
public function cre_param_alipay($total_amount=0,$body='',$out_trade_no='',$openid){
// 进公帐
$version_path = 'qrxs_alipay_cert_new';
$alipayconf = [
'partner' => '2******************6', //合作者身份id
'app_id' => '2******************07', //appid
'seller_id' => $openid, //卖家账号
];
$notify_url = '/pay/pay/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'=>$_SERVER['HTTP_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签名
// dump($private_key_path);
$priKey = file_get_contents($private_key_path);
// dump($priKey);
$res = openssl_get_privatekey($priKey);
// dump($res);
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;
}
//支付宝支付回调接口 3.1.0新账号
public function alipay_new(){
$openid=Session::get('openid');
$this->alipay_config = array(
'partner'=> '2*****************6', //合作者身份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' => $openid, //卖家账号
'notify_url' => '', // 回调域名
);
// dump(LIB_PATH);
require_once LIB_PATH."/alipay/alipay_notify_app.class.php";
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($this->alipay_config);
$verify_result = $alipayNotify->verifyNotify();
// dump($verify_result);
if($verify_result) {
// 逻辑处理
echo "success";
} else {
echo "fail";
}
}
请求封装
//通过CURL,发送http的post请求
// 返回xml数据
function http_request($xmldata, $url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
curl_setopt($ch,
CURLOPT_HTTPHEADER,
array(
'Content-type: text'
)
);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
对了那个回调要文件需要看的可以去我的下载里
放在面下/thinkphp/library目录下面
不懂可以私信我~~~~~~