当前位置:网站首页>微信小程序提现功能
微信小程序提现功能
2022-06-12 22:01:00 【荒~】
1,开通微信支付账号,开通 企业付款到零钱

2,上代码
/**
* 提现功能
*/
public function payOrder()
{
$openid = input('openid');//用户openid
$userid = input('userid/d',0);//用户uid
$amount = input('amount/s','');//提现金额
$User = Db::name('user')->field('id,integral')->where(['id' => $userid])->find();
if ($User['integral'] > 0 && !empty($User)) {
$trade_no = 'XJ1314520521' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号
Db::startTrans();
try {
//添加支付信息 pay_trade
$data = [
'user_id' => $userid,
'class_id' => 3,
'order_no' => $trade_no,
'trade_no' => $trade_no,
'subject' => '职豆提现',
'trade_channel'=>'wxpay',
'amount' => $amount,//提现积分
'status'=>0,
'create_time' => time()
];
Db::name('pay_trade')->insert($data);
$card_grade = Db::name('pay_trade')->where(['order_no' => $data['order_no']])->update(['status' =>1]);//修改状态-支付中
$data['desc'] = '职豆提现';
$data['appid'] = 'XXXXXXXXXXX';
$data['openid'] = 'XXXXXXXXXXXXX';
$result = $this->txFunc($data['openid'],$data['order_no'],$amount,$data['desc'],$data['appid']);
// die;
if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && $card_grade){
$partner_trade_no = Db::name('pay_order')->where(['partner_trade_no' => $result['partner_trade_no']])->count();
if ($partner_trade_no > 0) {
$info = [
'payment_no' => $result['payment_no'],
'payment_time' => $result['payment_time'],
'status' => 1
];
Db::name('pay_order')->where(['partner_trade_no' => $result['partner_trade_no']])->update($info);
Db::name('user')->where(['openid' => $openid])->update(['amount' => 0]);
}
$msg = [
'code' => 0,
'msg' => '提现成功',
'data' => 0
];
// Db::commit();
$code = $amount['user_name'] . ':' . $amount['amount'];
$res = $this->sendMobileCaptcha('18735393892', $code);
} else {
$msg = [
'code' => 1,
'msg' => '提现失败',
'data' => 1
];
}
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}
} else {
$msg = [
'code' => 1,
'msg' => '您的余额不够提现哦~',
'data' => 4
];
}
}
/**
* 企业支付(向微信发起企业支付到零钱的请求)
* @param string $openid 用户openID
* @param string $trade_no 单号
* @param string $money 金额(单位分)
* @param string $desc 描述
* @param string $appid 协会appid
* @return string XML 结构的字符串
**/
public function txFunc($openid,$trade_no,$money,$desc,$appid)
{
$data = array(
'mch_appid' => $appid,//协会appid
'mchid' => 'XXXXXXXX',//微信支付商户号
'nonce_str' => $this->getNonceStr(), //随机字符串
'partner_trade_no' => $trade_no, //商户订单号,需要唯一
'openid' => $openid,
'check_name' => 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
'amount' => $money * 100, //付款金额单位为分
'desc' => $desc,//描述信息
'spbill_create_ip' => request()->ip(),
);
//生成签名
$data['sign'] = $this->makeSign($data);
//构造XML数据(数据包要以xml格式进行发送)
$xmldata = $this->arrToXml($data);
//请求url
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
//发送post请求
$res = $this->curl_post_ssl($url,$xmldata);
return $res;
}
function share($url){
$appID='XXXXX';//小程序appID
$appSecret='XXXXXXXXXXXXX';//小程序appSecret
$jssdk = new JSSDK($appID, $appSecret);
$signPackage = $jssdk->GetSignPackage(urldecode($url));
if(!isset($signPackage)){
return $this->apiNullJson(101);
}
$data=[
'appId'=>$appID,
'timestamp'=>$signPackage["timestamp"],
'nonceStr'=>$signPackage["nonceStr"],
'signature'=>$signPackage["signature"]
];
$msg = [
'code' => 0,
'msg' => 'OK',
'data' => $data
];
return json($msg);
}
/**
* 随机字符串
* @param int $length
* @return string
*/
function getNonceStr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* 签名
* @param $data
* @return string
*/
function makeSign($data)
{
$key="XXXXXXXXXXXXXXX";//商户秘钥 微信支付平台-》 API安全-》设置APIv2密钥
// 关联排序
ksort($data);
// 字典排序
$str = http_build_query($data);
// 添加商户密钥
$str .= '&key=' . $key;
// 清理空格
$str = urldecode($str);
$str = md5($str);
// 转换大写
$result = strtoupper($str);
return $result;
}
/**
* 数组转XML
* @param $data
* @return string
*/
function arrToXml($data)
{
$xml = "<xml>";
// 遍历组合
foreach ($data as $k=>$v){
$xml.='<'.$k.'>'.$v.'</'.$k.'>';
}
$xml .= '</xml>';
return $xml;
}
/**
* XML转数组
* @param string
* return $data
* */
function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
/**
* [curl_post_ssl 发送curl_post数据]
* @param [type] $url [发送地址]
* @param [type] $xmldata [发送文件格式]
* @param [type] $second [设置执行最长秒数]
* @param [type] $aHeader [设置头部]
* @return [type] [description]
*/
function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
$isdir = "../extend/Cert/";//证书位置;绝对路径
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
}
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部数据使用HTTP协议中的"POST"操作来发送
$data = curl_exec($ch);//执行回话
if ($data) {
curl_close($ch);
return $this->xmlToArray($data);
} else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}
/*
* 发送短信验证码
*/
function sendMobileCaptcha($mobile,$code = ''){
$content = "您好:".$code."元提现成功";
$dataMsg["pwd"] ='XXXXXX';
$dataMsg["username"]='XXXXX';
$dataMsg["mobile"] = $mobile;
$dataMsg["content"] = $content;
$statusCode = $this->http_post("http://api.uoleem.com.cn/sms/uoleemApi",$dataMsg);
$arr = explode(',',$statusCode);
return $arr;
}
/*
* 发送POST请求
*/
function http_post($url,$data,$param = array()){
$ch = curl_init();
if(!empty($param)){
curl_setopt($ch, CURLOPT_HTTPHEADER, $param);
}
if (substr($url, 0, 8) == 'https://') {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);//获得返回数据
curl_close($ch);
return $result;
}
边栏推荐
- [qnx hypervisor 2.2 manuel de l'utilisateur] 4.2 environnement de construction pris en charge
- Use group_ Dplyr issues when using group_ by(multiple variables)
- leetcodeSQL:574. Elected
- Ansible playbook和Ansible Roles(三)
- Ansible foundation and common modules (I)
- SQL tuning guide notes 12:configuring options for optimizer statistics gathering
- SQL调优指南笔记6:Explaining and Displaying Execution Plans
- How to abstract a problem into a 0-1 knapsack problem in dynamic programming
- SQL tuning guide notes 15:controlling the use of optimizer statistics
- [sword finger offer] sword finger offer 58 - ii Rotate string left
猜你喜欢

Ansible foundation and common modules (I)

Palindrome linked list and linked list intersection problem (intersecting with Xinyi people) do you really know?

SQL调优指南笔记18:Analyzing Statistics Using Optimizer Statistics Advisor

SQL调优指南笔记8:Optimizer Access Paths

SQL tuning guide notes 18:analyzing statistics using optimizer statistics Advisor

How to write a vscode plug-in by yourself to realize plug-in freedom!

多线程模型下的生产者消费者模式

SQL tuning guide notes 16:managing historical optimizer statistics

建立高可用的数据库

Mr. Sun's version of JDBC (21:34:25, June 12, 2022)
随机推荐
Vagrantbox reinstalling the vboxsf driver
OceanBase 社区版 OCP 功能解读
Unity commonly used 3D mathematical calculation
How to write a vscode plug-in by yourself to realize plug-in freedom!
Turing prize winner: what should I pay attention to if I want to succeed in my academic career?
【QNX Hypervisor 2.2 用戶手册】4.2 支持的構建環境
Logstash timestamp converted to UNIX nanosecond nano second time
Leetcode Yanghui triangle
Semester summary of freshman year
Unity 常用3D数学计算
Open source background management system suitable for outsourcing projects
Pat grade A - 1167 Cartesian tree (30 points) (buildtree + level traversal)
Oracle SQL Developer的代码输入框中推荐使用的中文字体
SQL tuning guide notes 18:analyzing statistics using optimizer statistics Advisor
【概率论与数理统计】期末复习抱佛脚:公式总结与简单例题(完结)
[data analysis] data clustering and grouping based on kmeans, including Matlab source code
Ansible PlayBook et ansible roles (3)
SQL tuning guide notes 16:managing historical optimizer statistics
What is the difference between a user thread and a daemon thread?
MySQL master-slave replication