Be your own hero

一万年太久,只争朝夕

1.首先你要加载你的支付宝配置项

1
2
3
4
5
6
7
8
9
include('alipay/aop/AopClient.php');
include('alipay/aop/request/AlipayTradeAppPayRequest.php');
include('alipay/aop/request/AlipayTradeRefundRequest.php');
//支付宝appid (应用标识)
define("ALIPAY_APPID", "");
//支付宝(支付宝私钥)
define("PRIVATE_KEY", "");
//支付宝(支付宝公钥)
define("PUBLIC_KEY", "");

2,支付宝支付函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 支付宝支付
*/
public function appAlipay(){
// 时间戳
$timeStamp = strval(time());
$totalFee = 1;
// 支付结果显示文字
$serial_number = date("Ymdhis") . mt_rand(10, 99);
$aop = new \AopClient();
$bizcontent = json_encode([
'body'=>"测试", //商品名称
'subject'=>'测试', //主题
'out_trade_no'=> $serial_number, //此订单号为商户唯一订单号
'total_amount'=> $totalFee, //保留两位小数
'product_code'=>'QUICK_MSECURITY_PAY'
]);

//支付宝开始
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
//实际上线app id需真实的
$aop->appId = ALIPAY_APPID;
$aop->rsaPrivateKey = PRIVATE_KEY;
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = PUBLIC_KEY;

//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
$request = new \AlipayTradeAppPayRequest();
//支付宝回调
$notifyUrl="https://openapi.alipay.com";
$request->setNotifyUrl($notifyUrl);
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
$this->echoSuccess($response);

}

3,支付宝回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 支付宝支付回调
*
*/
public function alipayNotify() {
if(!empty($_POST)){
$serial=$_POST['out_trade_no'];
$wepay_serial = $_POST['trade_no'];
if (!empty($wepay_serial)) {
//这里可以写自己需求
echo "返回的参数out_trade_no:".$serial;
echo "返回的参数trade_no:".$wepay_serial;
}
}
echo 'success';
}

4.支付宝退款函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 /**
* 支付宝退货处理
* 退货前提是必须支付成功
* @param type $orderId
* @return bool
*/
public function alipayRefund($out_trade_no,$wepay_serial,$totalFee) {
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = ALIPAY_APPID;
$aop->rsaPrivateKey = PRIVATE_KEY;
$aop->alipayrsaPublicKey=PUBLIC_KEY;
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='GBK';
$aop->format='json';
$request = new AlipayTradeRefundRequest ();
$bizcontent = json_encode([
'out_trade_no'=>$out_trade_no,
'trade_no'=> $wepay_serial,
'refund_amount'=> $totalFee,
'refund_reason'=>'正常退款'
]);
$request->setBizContent($bizcontent);
$result = $aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
echo $resultCode;
if(!empty($resultCode)&&$resultCode == 10000){
echo "退款成功";
} else {
echo "退款失败";
}
}

/**
* 输出成功JSON消息
*/
final public function echoSuccess($msg = 'success') {
$this->echoMsg(0, $msg);
exit();
}

/**
* 输出JSON消息
* @param mixed $code
* @param mixed $msg
*/
final public function echoMsg($code, $msg = '', $options = JSON_UNESCAPED_UNICODE) {
return $this->echoJson(array(
'ret_code' => $code,
'ret_msg' => $msg
), $options);
}

/**
* 输出JSON
* @param mixed $arr
*/
final public function echoJson($arr, $options = JSON_UNESCAPED_UNICODE) {
header('Content-Type: application/json; charset=utf-8');
if (strpos(PHP_VERSION, '5.3') > -1) {
// php 5.3-
echo json_encode($arr);
} else {
// php 5.4+
echo json_encode($arr, $options);
}
return true;
}

}

RPC是什么?

rpc 全称 Remote pricedure call 就是一种进程间的通信方式
Rpc 简单 通用 高效。

PRC框架原理

RPC框架的目标就是让远程过程(服务)调用更加简单、透明,RPC框架负责屏蔽底
层的传输方式(TCP或者UDP)、序列化方式( XML/JSON/二进制)和通信细节。框架使
用者只需要了解谁在什么位置提供了什么样的远程服务接口即可,开发者不需要关心底层
通信细节和调用过程

RPC框架实现的几个核心技术点总结如下。

1)远程服务提供者需要以某种形式提供服务调用相关的信息,包括但不限于服务接
口定义、数据结构,或者中间态的服务定义文件,例如Thrift的IDL文件,WS-RPC
的WSDL文件定义,甚至也可以是服务端的接口说明文档:服务调用者需要通过
一.定的途径获取远程服务调用相关信息,例如服务端接口定义Jar包导入,获取
服务端IDL文件等。
2)远程代理对象:服务调用者调用的服务实际是远程服务的本地代理,对于Java语
言,它的实现就是JDK的动态代理,通过动态代理的拦截机制,将本地调用封装
成远程服务调用。
3)通信: RPC框架与具体的协议无关,例如Spring的远程调用支持HTTP Invoke、
RMIInvoke,MessagePack使用的是私有的二进制压缩协议。
4).序列化:远程通信,需要将对象转换成二进制码流进行网络传输,不同的序列化
框架,支持的数据类型、数据包大小、异常类型及性能等都不同。不同的RPC框
架应用场景不同,因此技术选择也会存在很大差异。-些做得比较好的RPC框架,
可以支持多种序列化方式,有的甚至支持用户自定义序列化框架(Hadoop Avro)。

RPC框架面临的挑战

在大规模服务化之前,应用可能只是通过RPC框架,简单的暴露和引用远程服务,
通过配置服务的URL地址进行远程服务调用,路由则通过F5硬件负载均衡器或者SLB
进行简单的负载均衡。
当服务越来越多时,服务URL配置管理变得非常困难,F5等硬件负载均衡器的单点
压力也越来越大。此时需要一个服务注册中心,动态地注册和发现服务,使服务的位置透
明。消费者在本地缓存服务提供者列表,实现软负载均衡,这可以降低对F5等硬件负载
均衡器的依赖,也能降低硬件成本。
随着业务的发展,服务间依赖关系变得错综复杂,甚至分不清哪个应用要在哪个应用
之前启动,架构师都不能完整地描述应用之间的调用关系。需要一个分布式消息跟踪系统
可视化展示服务调用链,用于依赖分析、业务调用路径梳理等,帮助架构师清理不合理的
服务依赖,防止业务服务架构腐化。
服务的调用量越来越大,服务的容量问题就暴露出来了,某个服务需要多少机器支撑、
什么时候该加机器?为了解决容量规划问题,需要采集服务调用KPI数据,进行汇总和分
析,通过计算得出服务部署实例数和服务器的配置规格。
服务上线容易下线难,上线前的审批,下线通知,需要统一的服务 生命周期管理流程
进行管控。不同的服务安全权限不同,如何保证敏感服务不被误调用?服务的访问安全策
略又如何制定?
服务化之后,随之而来的就是服务治理问题。目前业界开源纯粹的RPC框架服务治
理能力都不健全,当应用大规模服务化之后会面临许多服务治理方面的挑战,要解决这些
问题,必须通过服务框架+服务治理来完成,单凭RPC框架无法解决服务治理问题。

垂直应用架构

下面讲讲经典的MVC垂直架构

优点

学习成本低,架构技术单一,开大上手快,测试部署运维比较简单

MVC 架构

最前端是 View 主要用于前端展示,使用的开发工具为 jsp ,js ,html+css 等。向用户显示相关的数据,并且能接受用户的输入
中间为调度控制层 Control 主要用于前端web请求的分发,控制器接收数据并调用相对应的模型组件去处理,并显示相应的视图显示模型返回的数据
第三层为应用模型层 Model 主要用于处理数据和业务执行逻辑 当数据发生变化的时候 负责通知视图部分,由于一个模型可以被多个视图调用。提高了模型的可重用性

spring boot2.3.1

idea 安装

idea具体的安装本人就不写了,请自行百度

敲黑板 !! springboot 3种建立项目的方式

1.star.spring.io

快速建立 ,然后在idea里面导入 碰见的坑就是mavn 的安装,网上视频有的是老版本的不能用了

2.idea 里面的一个spring In啥的快速建立 其实和第一种方式一样 只是搬到了idea 上 ,

3.通过maven 建立spring项目

注意:这样一开始不是一个spring项目 需要在poe.xml里面进行增加配置项 才能算是一个spring项目

详细代码 https://github.com/wqeeqw/java