当前位置:网站首页>快手小程序担保支付php源码封装
快手小程序担保支付php源码封装
2022-07-08 00:16:00 【cms小程序插件【官方】】
抖音担保支付,虽然官方社区论坛已经有人整理分享了部分源码,但是并不全,我这边重新封装了一下,并且整合了入账,退款、查询等方法
<?php
/**
* 快手支付
*/
class KspayService
{
protected $appid;
protected $appSecret;
public $data = null;
public function __construct($appid, $appSecret)
{
$this->appid = $appid; //小程序APPID
$this->appSecret = $appSecret; //小程序的appsecret
}
/**
* 通过跳转获取用户的openid,跳转流程如下:
* @return 用户的openid
*/
public function getOpenid($code)
{
$url = 'https://open.kuaishou.com/oauth2/mp/code2session';
$dat = array(
'app_id' => $this->appid,
'app_secret' => $this->appSecret,
'js_code' => $code
);
if(isset($code)){
$res = self::curlPost($url,$dat);
$data = json_decode($res,true);
if($data['result'] == 1){
$openid = $data['open_id'];
return $openid;
}else{
echo "获取失败";
}
}else{
echo "参数错误";
}
}
/**
* 获取accessToken
* @return [type] [description]
*/
public function _getAccessToken() {
$postData['app_id'] = $this->appid;
$postData['app_secret'] = $this->appSecret;
$postData['grant_type'] = 'client_credentials';
$res = $this->curlPost('https://open.kuaishou.com/oauth2/access_token', $postData);
$res = json_decode($res, 1);
return $res['access_token'];
}
/**
* 生成签名
* @return 签名
*/
public function makeSign($query, $postData) {
unset($query['access_token']);
$arr = array_merge($query, $postData);
foreach ($arr as $k => $item) {
if (empty($item)) {
unset($arr[$k]);
}
}
ksort($arr, 2);
$str = '';
foreach ($arr as $k => $v) {
$str .= $k . '=' . $v . '&';
}
$str = substr($str, 0, strlen($str) - 1);
$md5 = $str .$this->appSecret;
return md5($md5);
}
/**
* 预下单
* @param [type] $orderid [description]
* @param [type] $price [description]
* @param [type] $subject [description]
* @param [type] $body [description]
* @param [type] $openid [description]
* @param [type] $notifyUrl [description]
* @return [type] [description]
*/
public function createOrder($orderid,$price,$subject,$body,$openid,$notifyUrl){
$time = time();
$price = $price*100;
$config = [
'access_token' => $this->_getAccessToken(),
'app_id' => $this->appid,
];
$data = [
'open_id' => $openid,
'out_order_no' => $orderid, //订单号
'total_amount' => $price, //金额 单位:分
'detail' => $body, //支付的内容
'subject' => $subject, //支付的标题
'type' => 1302,
'expire_time' => 3600,
'notify_url'=> $notifyUrl,
];
$data['sign'] = $this->makeSign($config,$data);
$url = 'https://open.kuaishou.com/openapi/mp/developer/epay/create_order?' . http_build_query($config);
$json = json_encode($data, 320);
$res = $this->jsonPost($url, $json);
return json_decode($res,true);
}
/**
* 订单结算
* @return [type] [description]
*/
public function settle($orderid,$amount){
$config = [
'access_token' => $this->_getAccessToken(),
'app_id' => $this->appid,
];
$params = [
'out_order_no' => $orderid,
'out_settle_no' => 'js'.$orderid,
'reason' =>'用户申请结算',//退款理由
'notify_url' => 'https://'.$_SERVER['HTTP_HOST'].'/jiesuan_notify.php'
];
$params['sign'] = $this->makeSign($config,$params);
$url = "https://open.kuaishou.com/openapi/mp/developer/epay/settle?". http_build_query($config);
$json = json_encode($params, 320);
$res = $this->jsonPost($url, $json);
return json_decode($res, true);
}
/**
* 订单查询
* @return [type] [description]
*/
public function queryOrder($orderid){
$config = [
'access_token' => $this->_getAccessToken(),
'app_id' => $this->appid,
];
$params = [
'out_order_no' => $orderid,
];
$params['sign'] = $this->makeSign($config,$params);
$url = "https://open.kuaishou.com/openapi/mp/developer/epay/query_order?". http_build_query($config);
$json = json_encode($params, 320);
$res = $this->jsonPost($url, $json);
return json_decode($res, true);
}
/**
* 退款
* @return [type] [description]
*/
public function createRefund($orderid,$amount){
$config = [
'access_token' => $this->_getAccessToken(),
'app_id' => $this->appid,
];
$params = [
'out_order_no' => $orderid,
'out_refund_no' => 'tk'.$orderid,
'reason' =>'用户申请退款',//退款理由
'notify_url' => 'https://'.$_SERVER['HTTP_HOST'].'/tk_notify.php',
'refund_amount' => $amount,
];
$params['sign'] = $this->makeSign($config,$params);
$url = "https://open.kuaishou.com/openapi/mp/developer/epay/apply_refund?". http_build_query($config);
$json = json_encode($params, 320);
$res = $this->jsonPost($url, $json);
return json_decode($res, true);
}
public function jsonPost($url, $data = NULL, $times = 0) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 2); //超时时间2秒
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length:' . strlen($data),
'Cache-Control: no-cache',
'Pragma: no-cache'
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
public static function curlGet($url = '', $options = array())
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
public function curlPost($url = '', $postData = '', $options = array())
{
if (is_array($postData)) {
$postData = http_build_query($postData);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
if (!empty($options)) {
curl_setopt_array($ch, $options);
}
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
}
?>回调:(快手支付的回调不需要对返回的参数做任何处理,也就是不需要排序、组装,直接拼接appsecret然后md5即可)
$result = file_get_contents('php://input');
$result = json_decode($result, true);
$kwaisign = isset($_SERVER['HTTP_KWAISIGN']) ? $_SERVER['HTTP_KWAISIGN'] : '';
if(true){
//完成你的逻辑
$orderid = $result['data']['out_order_no'];
if($result['data']['status'] == 'SUCCESS'){
$appSecret = ''; //您的appsecret
$resulta = json_encode($result);
$notify = md5($resulta.$appSecret);
if($notify == $kwaisign){
//校验成功,更新您的数据库
//下边是固定返回格式
$res = [
'result'=>1,
'message_id'=>$result['message_id']
];
echo json_encode($res);
}else{
echo 'Signature error';
}
}
}else{
echo 'pay error';
}小程序端的支付代码不再发,比较简单,有需要可以联系我,需要注意的是,快手小程序的入账需要根据订单号一笔一笔的处理,这点比较扯淡,不知道后期会不会调整
如果帮助到了您,别忘了支持一下

边栏推荐
- Guojingxin center "APEC investment +": some things about the Internet sector today | observation on stabilizing strategic industrial funds
- MySQL数据库(2)
- Application of slip ring in direct drive motor rotor
- Matlab method is good~
- Deep learning website
- About snake equation (2)
- ANSI / nema- mw- 1000-2020 magnetic iron wire standard Latest original
- Codeforces Round #649 (Div. 2)——A. XXXXX
- QT build with built-in application framework -- Hello World -- use min GW 32bit
- The method of using thread in PowerBuilder
猜你喜欢

Why does the updated DNS record not take effect?

ANSI / nema- mw- 1000-2020 magnetic iron wire standard Latest original

The beauty of Mathematics -- the principle of fine Fourier transform

Understanding of maximum likelihood estimation

Scalar / vector / matrix derivation method

About snake equation (5)

第七章 行为级建模

滑环在直驱电机转子的应用领域

COMSOL----微阻梁模型的搭建---最终的温度分布和变形情况----几何模型的建立

2、TD+Learning
随机推荐
2022 R1 fast opening pressure vessel operation test question bank and R1 fast opening pressure vessel operation free test questions
【目标跟踪】|DiMP: Learning Discriminative Model Prediction for Tracking
Application of slip ring in direct drive motor rotor
QT build with built-in application framework -- Hello World -- use min GW 32bit
Redis cluster
About snake equation (5)
Js中forEach map无法跳出循环问题以及forEach会不会修改原数组
Introduction to grpc for cloud native application development
滑环使用如何固定
剑指 Offer II 041. 滑动窗口的平均值
鼠标事件-事件对象
液压旋转接头的使用事项
Matlab method is good~
Capability contribution three solutions of gbase were selected into the "financial information innovation ecological laboratory - financial information innovation solutions (the first batch)"
break net
Grey correlation analysis link (portal) matlab
ROS problems (topic types do not match, topic datatype/md5sum not match, MSG XXX have changed. rerun cmake)
QML fonts use pixelsize to adapt to the interface
Anaconda3 download address Tsinghua University open source software mirror station
The difference between distribution function and probability density function of random variables