当前位置:网站首页>微信小程序提现功能
微信小程序提现功能
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;
}
边栏推荐
- lambda表达式与流优化代码
- 经济学人聚焦WTO MC12:数字经济或成重要议题
- Design and practice of Hudi bucket index in byte skipping
- leetcodeSQL:574. Elected
- Ansible playbook and ansible roles (III)
- Economist focuses on WTO MC12: digital economy may become an important issue
- MySQL master-slave replication
- June training (day 11) - matrix
- [Jianzhi offer simple] Jianzhi offer 06 Print linked list from end to end
- Unity 常用3D数学计算
猜你喜欢

Oracle LiveLabs实验:Introduction to Oracle Spatial Studio

PCB package download website recommendation and detailed usage

Ansible-大总结(六)

建立高可用的数据库

Ansible summary (VI)

Leetcode: the maximum number of building change requests that can be reached (if you see the amount of data, you should be mindless)

Have you really learned the common ancestor problem recently?

You can move forward or backward. This function in idea is amazing!

2021 rust survey results released: 9354 questionnaires collected

SQL调优指南笔记16:Managing Historical Optimizer Statistics
随机推荐
SQL调优指南笔记9:Joins
[C language] data type occupation
Exception encountered by selenium operation element
SQL tuning guide notes 11:histograms
Oracle SQL Developer的代码输入框中推荐使用的中文字体
IPhone: save Boolean into core data - iphone: save Boolean into core data
[Jianzhi offer] Jianzhi offer 09 Implementing queues with two stacks
Ansible playbook和变量(二)
What is the race condition? How do you find and solve the competition?
Ansible summary (VI)
Ansible-大总结(六)
Prefix sum and difference
Things about the kotlin collaboration process - pipeline channel
Ansible playbook和Ansible Roles(三)
SQL调优指南笔记10:Optimizer Statistics Concepts
My struggle: my years in foreign enterprises (1)
JVisualVM初步使用
February 27th
PE安装win10系统
MySQL architecture and basic management (II)