当前位置:网站首页>快手小程序担保支付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';
}小程序端的支付代码不再发,比较简单,有需要可以联系我,需要注意的是,快手小程序的入账需要根据订单号一笔一笔的处理,这点比较扯淡,不知道后期会不会调整
如果帮助到了您,别忘了支持一下

边栏推荐
- Grey correlation analysis link (portal) matlab
- How does Matplotlib generate multiple pictures in turn & only save these pictures without displaying them in the compiler
- Probability distribution
- 正则表达式
- Sword finger offer II 041 Average value of sliding window
- Tapdata 的 2.0 版 ,开源的 Live Data Platform 现已发布
- Why does the updated DNS record not take effect?
- 3. Multi agent reinforcement learning
- ROS 问题(topic types do not match、topic datatype/md5sum not match、msg xxx have changed. rerun cmake)
- Gnuradio operation error: error thread [thread per block [12]: < block OFDM_ cyclic_ prefixer(8)>]: Buffer too small
猜你喜欢

ArrayList源码深度剖析,从最基本的扩容原理,到魔幻的迭代器和fast-fail机制,你想要的这都有!!!

碳刷滑环在发电机中的作用

剑指 Offer II 041. 滑动窗口的平均值

From starfish OS' continued deflationary consumption of SFO, the value of SFO in the long run

Redis集群

Sword finger offer II 041 Average value of sliding window

STM32GPIO口的工作原理
![[SolidWorks] modify the drawing format](/img/3c/b00e4510b1e129069140c2666c0727.png)
[SolidWorks] modify the drawing format

Application of slip ring in direct drive motor rotor

The beauty of Mathematics -- the principle of fine Fourier transform
随机推荐
Version 2.0 de tapdata, Open Source Live Data Platform est maintenant disponible
Redux usage
Grey correlation analysis link (portal) matlab
不算不知道,花呗分期的真实利率居然这么高
Graphic network: uncover the principle behind TCP's four waves, combined with the example of boyfriend and girlfriend breaking up, which is easy to understand
The numerical value of the number of figures thought of by the real-time update of the ranking list
ROS 问题(topic types do not match、topic datatype/md5sum not match、msg xxx have changed. rerun cmake)
Leetcode exercise - Sword finger offer 36 Binary search tree and bidirectional linked list
LaTeX 中 xcolor 颜色的用法
common commands
The persistence mode of redis - RDB and AOF persistence mechanisms
碳刷滑环在发电机中的作用
小金额炒股,在手机上开户安全吗?
About snake equation (3)
C语言-模块化-Clion(静态库,动态库)使用
子矩阵的和
Understanding of expectation, variance, covariance and correlation coefficient
Frequency probability and Bayesian probability
Matlab method is good~
MySQL查询为什么没走索引?这篇文章带你全面解析