首页
友人帐
留言板
关于
Search
1
IDE Eval Resetter:JetBrains 全家桶无限试用插件
243 阅读
2
影视资源采集站收录大全
177 阅读
3
linux安装或升级protoc
153 阅读
4
批量采集美女写真等图片做图片站
115 阅读
5
VFM 3.7.5 源码 - 一个极简的 PHP 私人云盘!
95 阅读
谈天说地
程序源码
技术教程
成品源码
登录
Search
标签搜索
PHP
linux
源码
go
windows
centos
原创
mysql
微信
激活
采集
宝塔
绿色版
API
解析
SDK
图片
破解
域名
html
云青
累计撰写
150
篇文章
累计收到
77
条评论
首页
栏目
谈天说地
程序源码
技术教程
成品源码
页面
友人帐
留言板
关于
搜索到
4
篇与
的结果
2019-11-04
分享自用支付宝支付类
分享自用的支付宝支付类目前只封装了 订单查询以及app支付更多的支付 后期会集成异步主要商户订单号查询 并确定金额是否与数据库中一致以及判断该商户订单号是否处理过(谨记)个人觉得验签并不重要 有订单查询以及数据库订单验证就行了过多的就不介绍了 源码有注释 <?php /** * @author anderyly * @email admin@aaayun.cc * @link https://blog.aaayun.cc/ * @copyright Copyright (c) 2019 */ class AliPay { // 应用ID public $appId; // 私钥 public $privateKey; // 公钥 public $publicKey; // 异步地址 public $notify_url; // 同步地址 public $return_url; //返回数据格式 public $format = "json"; //版本 public $version = "1.0"; // 编码 public $charset = "UTF-8"; //签名类型 public $signType = "RSA2"; // 配置 public $config; // 网关 public $gatewayUrl = "https://openapi.alipay.com/gateway.do"; public function __construct($appid, $privateKey, $publicKey, $notify_url, $return_url) { $this->appId = $appid; $this->privateKey = $privateKey; $this->publicKey = $publicKey; $this->notify_url = $notify_url; $this->return_url = $return_url; $this->config = [ 'alipay_sdk' => 'alipay-sdk-php-20180705', 'app_id' => $this->appId, 'notify_url' => $this->notify_url, 'sign_type' => $this->signType, 'charset' => $this->charset, 'timestamp' => date('Y-m-d H:i:s', time()), 'version' => $this->version ]; } /** * app支付 * @param $out_trade_no 商户订单号 * @param $total_amount 金额 * @param $subject 标题 * @return arrray */ public function app($out_trade_no, $total_amount, $subject) { $method = 'alipay.trade.app.pay'; $config = $this->config; $config['method'] = $method; $biz = [ 'total_amount' => $total_amount, 'product_code' => 'QUICK_MSECURITY_PAY', 'subject' => $subject, 'out_trade_no' => $out_trade_no ]; $arr = [ 'subject' => $biz['subject'], 'out_trade_no' => $out_trade_no, 'total_amount' => $biz['total_amount'], 'appid' => $this->appId, 'notify_url' => $this->notify_url, 'sign_type' => $this->signType ]; $biz_content = json_encode($biz, JSON_UNESCAPED_UNICODE); $config['biz_content'] = $biz_content; ksort($config); $config['sign'] = $this->sign($config); $params_url = ''; foreach ($config as $k => $v) { if (!empty($v)) { $params_url .= $k . '=' . urlencode($v) . '&'; } } $params_url = rtrim($params_url, '&'); $arr['sign'] = $params_url; return $arr; } /** * 订单查询 * @param $out_trade_no * @param $total_amount * @return bool|arrray */ public function orderQuery($out_trade_no, $total_amount = '') { $method = 'alipay.trade.query'; $config = $this->config; $config['method'] = $method; unset($config['notify_url']); $biz = [ 'out_trade_no' => $out_trade_no ]; $biz_content = json_encode($biz, JSON_UNESCAPED_UNICODE); $config['biz_content'] = $biz_content; ksort($config); $config['sign'] = $this->sign($config); $res = $this->curl($config); $res = json_decode($res, true); $res = $res['alipay_trade_query_response']; if ($res['code'] == 10000 and $res['msg'] == 'Success' and $res['trade_status'] == 'TRADE_SUCCESS') { if (empty($total_amount)) { return $res; } else { if ($res['total_amount'] == $total_amount) { return $res['trade_no']; } else { return false; } } } else { return false; } } /** * curl请求 * @param $data * @return bool|int|mixed|string */ private function curl($data) { @header("Content-type: text/html;charset=gb2312"); $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSLVERSION, 1); curl_setopt($ch, CURLOPT_URL, $this->gatewayUrl); if (is_array($data)) { curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); } elseif (is_string($data)) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, true); $content = curl_exec($ch); curl_close($ch); return $content; } /** * 签名 * @param $data * @return bool|string */ private function sign($params) { $stringToBeSigned = ""; $i = 0; foreach ($params as $k => $v) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { if ($i == 0) { $stringToBeSigned .= "$k" . "=" . "$v"; } else { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } unset ($k, $v); // 私钥处理 $res = "-----BEGIN RSA PRIVATE KEY-----" . PHP_EOL . wordwrap($this->privateKey, 64, PHP_EOL, true) . PHP_EOL . "-----END RSA PRIVATE KEY-----"; ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置'); openssl_sign($stringToBeSigned, $sign, $res, OPENSSL_ALGO_SHA256); $key = base64_encode($sign); return $key; } private function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } }
2019年11月04日
6 阅读
0 评论
0 点赞
2019-11-02
[更新]php微信支付类(含h5支付、APP二次签名、jsapi支付)
博主之封装过一个微信支付类 很长时间没有更新了 现在分享一下自用的微信支付类该类含有微信app支付 h5支付 公众号支付(jsapi) 订单查询native扫码支付后面会添加异步主要商户订单号查询 并确定金额是否与数据库中一致以及判断该商户订单号是否处理过(谨记)个人觉得验签并不重要 有订单查询以及数据库订单验证就行了过多的就不介绍了 源码有注释<?php /** * @author anderyly * @email anderyly@sina.com * @link https://blog.aaayun.cc/ * @copyright Copyright (c) 2018 */ class WxPay { // 微信分配的公众账号ID public $appId; // 微信支付分配的商户号 public $mch_id; // 微信支付分配的商户密钥 public $key; // 回调地址 public $notify_url; // 随机字符串 public $nonce_str; // 站点名称 public $webName; // 站点url地址 public $webUrl; // h5支付成功后跳转的地址 public $redirect_url; /** * [__construct 初始化配置] */ public function __construct($data) { $this->appId = $data['appId']; $this->mch_id = $data['mch_id']; $this->key = $data['key']; $this->notify_url = $data['notify_url']; if (isset($data['webName'])) $this->webName = $data['webName']; if (isset($data['webUrl'])) $this->webUrl = $data['webUrl']; if (isset($data['redirect_url'])) $this->redirect_url = $data['redirect_url']; $this->nonce_str = $this->rand_code(); } /** * [h5 html5支付] * @param out_trade_no [订单号] * @param $body [商品描述] * @param $ip [ip地址] * @param $total_fee [订单总金额] * @return array|bool */ public function h5($out_trade_no, $body, $ip, $total_fee) { $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $data = [ 'appid' => $this->appId, 'mch_id' => $this->mch_id, 'body' => $body, 'spbill_create_ip' => $ip, 'total_fee' => $total_fee * 100, 'out_trade_no' => $out_trade_no, 'nonce_str' => $this->nonce_str, 'notify_url' => $this->notify_url, 'trade_type' => 'MWEB', 'scene_info' => "{'h5_info':{'type': 'WAP','wap_url': $this->webUrl,'wap_name': $this->webName}}" ]; $data['sign'] = $this->sign($data); //获取签名 $data = $this->curlWx($url, $this->ToXml($data)); if ($data) { $res = $this->FromXml($data); if (isset($res['return_code']) and $res['return_code'] != 'SUCCESS' and isset($res['return_msg']) and $res['return_msg'] == 'OK' and isset($res['result_code']) and $res['result_code'] == 'SUCCESS') { exit("签名失败!"); } else { $url = $res['mweb_url'] . '&redirect_url=' . urlencode($this->redirect_url); exit('<script src="https://open.mobile.qq.com/sdk/qqapi.js?_bid=152"></script><script type="text/javascript">mqq.ui.openUrl({ target: 2,url: "' . $url . '"});</script>'); } } } /** * [app 移动端二次签名] * @param out_trade_no [订单号] * @param $body [商品描述] * @param $ip [ip地址] * @param $total_fee [订单总金额] * @return array|bool */ public function app($out_trade_no, $body, $ip, $total_fee) { $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $data = [ 'appid' => $this->appId, 'mch_id' => $this->mch_id, 'body' => $body, 'spbill_create_ip' => $ip, 'total_fee' => $total_fee * 100, 'out_trade_no' => $out_trade_no, 'nonce_str' => $this->nonce_str, 'notify_url' => $this->notify_url, 'trade_type' => 'APP', ]; $data['sign'] = $this->Sign($data); $data = $this->curlWx($url, $this->ToXml($data)); if ($data) { $res = $this->FromXml($data); if ($res['return_code'] != 'SUCCESS') { return false; } else { $arr = [ 'prepayid' => $res['prepay_id'], 'appid' => $this->appId, 'partnerid' => $this->mch_id, 'package' => 'Sign=WXPay', 'noncestr' => $this->nonce_str, 'timestamp' => time(), ]; $sign = $this->sign($arr, 1); $arr['out_trade_no'] = $out_trade_no; $arr['return_code'] = $res['return_code']; $arr['sign'] = $sign; return $arr; } } else { return false; } } /** * [h5 html5支付] * @param $out_trade_no [订单号] * @param $body [商品描述] * @param $ip [ip地址] * @param $total_fee [订单总金额] * @param $openid [授权用户的openid] * @return array|bool */ public function jsapi($out_trade_no, $body, $ip, $total_fee, $openid) { $url = 'https://api2.mch.weixin.qq.com/pay/unifiedorder'; $data = [ 'appid' => $this->appId, 'mch_id' => $this->mch_id, 'body' => $body, 'spbill_create_ip' => $ip, 'total_fee' => $total_fee * 100, 'out_trade_no' => $out_trade_no, 'nonce_str' => $this->nonce_str, 'notify_url' => $this->notify_url, 'trade_type' => 'JSAPI', 'openid' => $openid ]; $data['sign'] = $this->Sign($data, 1); $data = $this->curlWx($url, $this->ToXml($data)); if ($data) { $res = $this->FromXml($data); if ($res['return_code'] != 'SUCCESS') { return false; } else { $arr = [ 'appId' => $res['appid'], 'package' => 'prepay_id=' . $res['prepay_id'], 'nonceStr' => $this->nonce_str, 'timeStamp' => time(), 'signType' => 'MD5' ]; $sign = $this->sign($arr); $as['nonceStr'] = $arr['nonceStr']; $as['package'] = $arr['package']; $as['sign'] = $sign; $as['timestamp'] = $arr['timeStamp']; $as['appid'] = $arr['appId']; return $as; } } else { return false; } } /** * [curlWx 发送curl请求] * @param $url [url地址] * @param $xml [xml] * @return mixed */ protected function curlWx($url, $xml) { //header("Content-type:text/xml"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if (stripos($url, "https://") !== FALSE) { curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); } else { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); $data = curl_exec($ch); curl_close($ch); return $data; } /** * [sign 签名] * @param null $app [不为null开启二次签名] * @return string */ protected function sign($params, $app = NULL) { ksort($params); foreach ($params as $key => $item) { if (!empty($item)) $newArr[] = $key . '=' . $item; } $stringA = implode("&", $newArr); $stringSignTemp = $stringA . "&key=" . $this->key; $sign = MD5($stringSignTemp); if (is_null($app)) $sign = strtoupper($sign); return $sign; } /** * [FromXml xml转数组] * @param $xml * @return bool|mixed */ public function FromXml($xml) { if (!$xml) return false; libxml_disable_entity_loader(true); $data = @json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $data; } /** * [ToXml 参数组装成xml] * @param array $data * @return bool|string */ public function ToXml($data = []) { if (!is_array($data) || count($data) <= 0) return false; $xml = "<xml>"; foreach ($data as $key => $val) { if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } else { $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">"; } } $xml .= "</xml>"; return $xml; } /** * [rand_code 生成随机字符串] * @return bool|string */ protected function rand_code() { $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符 $str = str_shuffle($str); $str = substr($str, 0, 32); return $str; } /** * [orderQuery 查询订单] * @param $order [商户订单号] * @param $money [订单金额] * @return bool [false | 成功返回流水号] */ public function orderQuery($order, $money) { $url = 'https://api.mch.weixin.qq.com/pay/orderquery'; $data = array( 'appid' => $this->appId, 'mch_id' => $this->mch_id, 'nonce_str' => $this->nonce_str, 'out_trade_no' => $order ); $data['sign'] = $this->sign($data); $data = $this->curlWx($url, $this->ToXml($data)); if ($data) { $res = $this->FromXml($data); if ($res['return_code'] == 'FAIL') { return false; } else { // if (isset($res['return_code']) and $res['return_code'] == 'SUCCESS' and isset($res['return_msg']) and $res['return_msg'] == 'OK' and isset($res['result_code']) and $res['result_code'] == 'SUCCESS' and isset($res['trade_state']) and $res['trade_state'] == 'SUCCESS') { // if ($res['total_fee'] == ($money * 100)) { return $res['transaction_id']; } else { return false; } // } else { return false; } // } // } else { return false; } } }该类含有微信app支付 h5支付 公众号支付(jsapi) 订单查询native扫码支付后面会添加异步主要商户订单号查询 并确定金额是否与数据库中一致以及判断该商户订单号是否处理过(谨记)个人觉得验签并不重要 有订单查询以及数据库订单验证就行了过多的就不介绍了 源码有注释
2019年11月02日
6 阅读
0 评论
0 点赞
2019-04-03
分享一个PHP环信服务端操作类
之前做直播系统,需要用到通信这一块,由于官方文档没有sdk,博主本人也是google的,顺便修改了一下 <?php namespace hx; class Hx { private $app_key = '1106196338107043#bfzb'; private $client_id = 'YXA68gwqIDr4Eem08DO8sr_xCA'; private $client_secret = 'YXA57if_NzYCtL_96DktWsvILrlcU24'; private $url = "https://a1.easemob.com/1106190228107043/bfzb"; /* * 获取APP管理员Token */ public function __construct() { $url = $this->url . "/token"; $data = array( 'grant_type' => 'client_credentials', 'client_id' => $this->client_id, 'client_secret' => $this->client_secret ); $rs = json_decode($this->curl($url, $data), true); $this->token = $rs['access_token']; } /* * 注册IM用户(授权注册) */ public function hx_register($username, $password, $nickname) { $url = $this->url . "/users"; $data = array( 'username' => $username, 'password' => $password, 'nickname' => $nickname ); $header = array( 'Content-Type: application/json', 'Authorization: Bearer ' . $this->token ); return $this->curl($url, $data, $header, "POST"); } /* * 给IM用户的添加好友 */ public function hx_contacts($owner_username, $friend_username) { $url = $this->url . "/users/${owner_username}/contacts/users/${friend_username}"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "POST"); } /* * 解除IM用户的好友关系 */ public function hx_contacts_delete($owner_username, $friend_username) { $url = $this->url . "/users/${owner_username}/contacts/users/${friend_username}"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "DELETE"); } /* * 查看好友 */ public function hx_contacts_user($owner_username) { $url = $this->url . "/users/${owner_username}/contacts/users"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "GET"); } /* 发送文本消息 */ public function hx_send($sender, $receiver, $msg) { $url = $this->url . "/messages"; $header = array( 'Authorization: Bearer ' . $this->token ); $data = array( 'target_type' => 'users', 'target' => array( '0' => $receiver ), 'msg' => array( 'type' => "txt", 'msg' => $msg ), 'from' => $sender, 'ext' => array( 'attr1' => 'v1', 'attr2' => "v2" ) ); return $this->curl($url, $data, $header, "POST"); } /* 查询离线消息数 获取一个IM用户的离线消息数 */ public function hx_msg_count($owner_username) { $url = $this->url . "/users/${owner_username}/offline_msg_count"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "GET"); } /* * 获取IM用户[单个] */ public function hx_user_info($username) { $url = $this->url . "/users/${username}"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "GET"); } /* * 获取IM用户[批量] */ public function hx_user_infos($limit) { $url = $this->url . "/users?${limit}"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "GET"); } /* * 重置IM用户密码 */ public function hx_user_update_password($username, $newpassword) { $url = $this->url . "/users/${username}/password"; $header = array( 'Authorization: Bearer ' . $this->token ); $data['newpassword'] = $newpassword; return $this->curl($url, $data, $header, "PUT"); } /* * 删除IM用户[单个] */ public function hx_user_delete($username) { $url = $this->url . "/users/${username}"; $header = array( 'Authorization: Bearer ' . $this->token ); return $this->curl($url, "", $header, "DELETE"); } /* * 修改用户昵称 */ public function hx_user_update_nickname($username, $nickname) { $url = $this->url . "/users/${username}"; $header = array( 'Authorization: Bearer ' . $this->token ); $data['nickname'] = $nickname; return $this->curl($url, $data, $header, "PUT"); } /* * * curl */ private function curl($url, $data, $header = false, $method = "POST") { $ch = curl_init($url); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($header) { curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); if ($data) { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); } curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $ret = curl_exec($ch); return $ret; } } $rs = new Hx(); // 注册的用户 echo $rs->hx_register('qwerasd', 'qazwsx', '福州123'); // 给IM用户的添加好友 // echo $rs->hx_contacts('admin888', 'qwerasd'); /* 发送文本消息 */ // echo $rs->hx_send('213123','admin888','dfadsr214wefaedf'); /* 消息数统计 */ // echo $rs->hx_msg_count('admin888'); /* 获取IM用户[单个] */ // echo $rs->hx_user_info('admin888'); /* 获取IM用户[批量] */ // echo $rs->hx_user_infos('20'); /* 删除IM用户[单个] */ // echo $rs->hx_user_delete('wwwwww'); /* 修改用户昵称 */ // echo $rs->hx_user_update_nickname('asaxcfasdd','网络科技'); /* 重置IM用户密码 */ // echo $rs->hx_user_update_password('asaxcfasdd','asdad'); /* 解除IM用户的好友关系 */ // echo $rs->hx_contacts_delete('admin888', 'qqqqqqqq'); /* 查看好友 */ //echo $rs->hx_contacts_user('admin888');
2019年04月03日
8 阅读
2 评论
0 点赞
2018-11-13
微信支付类(含h5支付、APP二次签名)
最新地址 https://vclove.cn/archives/492.html什么是微信H5支付H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付开发流程1、用户在商户侧完成下单,使用微信支付进行支付2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页4、中间页进行H5权限的校验,安全性检查(此处常见错误请见下文)5、如支付成功,商户后台会接收到微信侧的异步通知6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)7、商户在展示页面,引导用户主动发起支付结果的查询8、商户后台判断是否接到收微信侧的支付结果通知,如没有,后台调用订单查询接口确认订单状态9、展示最终的订单支付结果给用户相信大家都用过企鹅的sdk吧,那酸爽让人难以接受h5的支付我就不给大家截图了,看调用方式就知道了APP签名结果微信支付类库下载地址:wepay.tar.gz
2018年11月13日
3 阅读
0 评论
0 点赞