2022年4月
本地可视化客户端连远程redis云主机(远程连腾讯云主机redis)教程
登陆到腾讯云主机管理面板,在“防火墙”里放行redis用到的端口,允许通行状态。
进入宝塔控制面板(非宝塔环境同理)找到rdids管理面板,单击进入如下界面。
上图中的ip与端口基本不用动,需要注意的是端口要一致,这里要设置一个管理密码,密码在下面会用到。
在宝塔的管理面板,将上面redis用到的端口(6379)放行,同时将SSH端口(22)放行。
打开本地redis客户端,根据上图进行填写即可,需要注意的是,两处IP地址要注意,特别是:127.0.0.1这里基本不用动的,只需要修改其它参数即可。
出现上图,即说明成功链接,可本地可视管理了。
pack 与 unpack 的使用方法
webman与yansongda/pay开发支付完整Demo
直接上代码
<?php
namespace app\controller;
use support\Request;
use support\Response;
use Yansongda\Pay\Pay;
class Payment
{
protected $config = [
'alipay' => [
'default' => [
// 必填-支付宝分配的 app_id
'app_id' => 'wx4926de289f70b113',
// 必填-应用私钥 字符串或路径
'app_secret_cert' => 'MIIEvLoLc1s/VdBHku+JEd0YmEY+p4sjmcRnlu4AlzLxkWUTTg==',
// 必填-应用公钥证书 路径
'app_public_cert_path' => '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',
// 必填-支付宝公钥证书 路径
'alipay_public_cert_path' => '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',
// 必填-支付宝根证书 路径
'alipay_root_cert_path' => '/Users/yansongda/pay/cert/alipayRootCert.crt',
'return_url' => 'https://yansongda.cn/alipay/return',
'notify_url' => 'https://yansongda.cn/alipay/notify',
// 选填-第三方应用授权token
'app_auth_token' => '',
// 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数
'service_provider_id' => '',
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
]
],
'wechat' => [
'default' => [
// 必填-商户号,服务商模式下为服务商商户号
'mch_id' => '123xxxx02',
// 必填-商户秘钥
'mch_secret_key' => 'xxxxx', //api安全中心里的V3密码32位的那个
// 必填-商户私钥 字符串或路径
'mch_secret_cert' => '/xxxxx/apiclient_key.pem', //api安全中心里下载的的密钥,绝对路径
// 必填-商户公钥证书路径
'mch_public_cert_path' => '/xxxx/apiclient_cert.pem', //api安全中心里下载的公钥,绝对路径
// 必填
'notify_url' => 'https://www.xxx.com/member/wx_native_notify', //支付回调地址必须https
// 选填-公众号 的 app_id
'mp_app_id' => 'wx4926de289f70b113',
// 选填-小程序 的 app_id
'mini_app_id' => '',
// 选填-app 的 app_id
'app_id' => '',
// 选填-合单 app_id
'combine_app_id' => '',
// 选填-合单商户号
'combine_mch_id' => '',
// 选填-服务商模式下,子公众号 的 app_id
'sub_mp_app_id' => '',
// 选填-服务商模式下,子 app 的 app_id
'sub_app_id' => '',
// 选填-服务商模式下,子小程序 的 app_id
'sub_mini_app_id' => '',
// 选填-服务商模式下,子商户id
'sub_mch_id' => '',
// 选填-微信公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数
'wechat_public_cert_path' => [
'4248DC46520F9EAC26C7FET4464ADBE5ADDA3A' => '/xxxx/wechatpay_public.pem', //通过算法生成的,具体生成方式往下面看。
],
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
]
],
'logger' => [
'enable' => false,
'file' => './logs/alipay.log',
'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
'type' => 'single', // optional, 可选 daily.
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
];
//二维码生成展示页
public function index(Request $request)
{
Pay::config($this->config);
$order = [
'out_trade_no' => time().'',
'description' => 'subject-测试',
'amount' => [
'total' => 1,
],
];
$result = Pay::wechat()->scan($order);
// 二维码内容: $qr = $result->code_url;
//var_export($result->code_url);
return view('payment/index', ['code_url' => $result->code_url]);
}
//支付成功回调
public function verify(Request $request)
{
Pay::config($this->config);
// 是的,你没有看错,就是这么简单!
$result = Pay::wechat()->callback($request->post());
file_put_contents(__DIR__ . '/notify_result_ysd.txt',
date('Y-m-d H:i:s') . ':' . var_export($result, true));
//这里很关键,需要注意。
return new Response(200, [], json_encode(['code' => 'SUCCESS', 'message' => '成功']));
}
}
微信支付平台证书下载:
一套符合程序员思维的微信支付V3文档
WechatPay-API-v3
webman与EasyWechat6.x的开发微信V3支付,完整的Demo
话不多说直接上代码:
// app\member\controller\pay.php
<?php
namespace app\controller;
use EasyWeChat\Kernel\Exceptions\Exception;
use EasyWeChat\Kernel\Exceptions\InvalidArgumentException;
use support\Request;
use EasyWeChat\Pay\Application;
use Symfony\Component\HttpFoundation\HeaderBag;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
class Index
{
private $config = [
'mch_id' => 'xxxx', //根据自已实际的填写
// 商户证书
'private_key' => '/xxx/apiclient_key.pem',//根据自已实际的填写,绝对路径
'certificate' => '/xxx/apiclient_cert.pem', //根据自已实际的填写,绝对路径
// v3 API 秘钥
'secret_key' => 'xxxx', //根据自已实际的填写
// v2 API 秘钥
'v2_secret_key' => 'xxx', //根据自已实际的填写
'platform_certs' => [
'/xxx/wechatpay_public.pem', //根据自已实际的填写,获取办法见下面。
],
'http' => [
'throw' => true, // 状态码非 200、300 时是否抛出异常,默认为开启
'timeout' => 5.0,
// 'base_uri' => 'https://api.mch.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri
],
];
//二维码生成展示页
public function index(Request $request)
{
try {
$app = new Application($this->config);
$response = $app->getClient()->post('/v3/pay/transactions/native', [
'json' => [
'mchid' => (string)$app->getMerchant()->getMerchantId(),
'out_trade_no' => 'SN_'.time(),
'appid' => 'xxxx', //根据自已实际的填写
'description' => '测试内容',
'notify_url' => 'https://www.xxxx.com/member/wx_native_notify', //注意是ssl协议
'amount' => [
'total' => 2,
'currency' => 'CNY',
]
]
]);
} catch (InvalidArgumentException $e) {
//
}
return view('index/index', ['code_url' => $response->toArray()]);
}
//回调
public function verify(Request $request)
{
try {
//下面四行很关键
$symfony_request = new SymfonyRequest($request->get(), $request->post(), [], $request->cookie(), [], [], $request->rawBody());
$symfony_request->headers = new HeaderBag($request->header());
$app = new Application($this->config);
$app->setRequestFromSymfonyRequest($symfony_request);
// $app 为你实例化的支付对象,此处省略实例化步骤
$server = $app->getServer();
// 处理支付结果事件
$server->handlePaid(function ($message) {
// $message 为微信推送的通知结果,详看微信官方文档
file_put_contents(__DIR__ . '/notify_result.txt',
date('Y-m-d H:i:s') . ':' . var_export($message, true));
// 微信支付订单号 $message['transaction_id']
// 商户订单号 $message['out_trade_no']
// 商户号 $message['mchid']
// 具体看微信官方文档...
// 进行业务处理,如存数据库等...
});
//这一步特别要注意,必须这么写。
return $server->serve()->getBody()->getContents();
} catch (Exception $e) {
echo $e->getMessage();
}
}
}
“平台证书”申请办法:http://www.liziyu.com/archives/309/
hyperf2.x或swoole环境使用easywehat6.x(cli框架可参考)
微信支付V3 平台证书(EasyWechat的platform_certs参数)如何下载?
第一步:
假设你已经成功安装了composer工具,并可以正常运行。下面以Linux或MacOS为例:
在任意目录下(如:Download),下载组件:
//
composer require wechatpay/wechatpay
//
第二步:
在当前(Download)项目目录下检测是否有可执行的命令文件:
//
composer exec -l
//
显示有可执行文件 CertificateDownloader.php 表示此文件可执行。
第三步:
执行以下令命:
//
composer exec CertificateDownloader.php
//
出现以上提示表示正常,可以继续往下。
第四步:
根据上图所示,组装命令行,规则通常如下:
//
composer exec CertificateDownloader.php -- -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}
//
这里参见:https://github.com/wechatpay-apiv3/wechatpay-php
组装完成后台命令行如下:
//
composer exec CertificateDownloader.php -- -k xxxxxx12345xxxxx -m 1238717442 -f /Users/liziyu/Documents/Wechat_Pay_Cert/wx_cert/apiclient_key.pem -s 4248DC46520F9EAC26C7DA22E3E74FDIGKEE87KA -o /Users/liziyu/Documents/Wechat_Pay_Cert/wx_cert
//
根据实际情况修改成自已的商户平台参数。
如果出现以上提示表示生成成功了。
如上图片示,生成的“平台证书”即可使用了。
最后:
附上微信官方PHP开发V3版 Demo供下载参考。
收藏一个微信支付v2版的php开发Demo
开发文档
微信支付V2的开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
微信支付V3的开发文档:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml
各支付接口的PHP演示(官方)
点击下载:
WxpayAPI_php.zip
PHP判断手机端与微信端
判断移动端的简单方法
$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
$iphone = (strpos($agent, 'iphone')) ? true : false;
$ipad = (strpos($agent, 'ipad')) ? true : false;
$android = (strpos($agent, 'android')) ? true : false;
if($iphone || $ipad || $android){
define('ISMOBILE',true);
} else {
define('ISMOBILE',false);
};
判断微信端的简单方法
function isWeixin() {
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
return true;
} else {
return false;
}
}