-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
163 lines (91 loc) · 37.4 KB
/
atom.xml
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Little Humor</title>
<subtitle>爱生活·爱技术·爱旅行</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://baidu.com/"/>
<updated>2018-08-06T05:59:59.456Z</updated>
<id>http://baidu.com/</id>
<author>
<name>小幽默</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Kafka消费者常用配置属性详解</title>
<link href="http://baidu.com/2018/08/06/kafka-consumer-properties/"/>
<id>http://baidu.com/2018/08/06/kafka-consumer-properties/</id>
<published>2018-08-06T05:50:21.000Z</published>
<updated>2018-08-06T05:59:59.456Z</updated>
<content type="html"><![CDATA[<h5 id="基础配置:"><a href="#基础配置:" class="headerlink" title="基础配置:"></a>基础配置:</h5><pre><code>bootstrap.servers.group.id / key.deserializer / value.deserializer。</code></pre><blockquote><p>Kafka的文档列出了所有与消费者相关的配置说明。大部分参数都有合理的默认值,一般不需要修改他们,不过有一些参数与消费者的性能和可用性有很大关系。</p></blockquote><h5 id="fetch-min-bytes"><a href="#fetch-min-bytes" class="headerlink" title="fetch.min.bytes"></a>fetch.min.bytes</h5><p> 消费者从服务器获取记录的最小字节数。broker在收到消费者的数据请求时,如果可用的数据量小于fetch.min.bytes指定的大小,那么它会等到有足够的可用数据时才把它返回给消费者。这样可以降低消费者和broker的工作负载(主题不是很活跃的时候就不需要来来回回地处理消息)。<br> <em>经验</em>:1.如果没有很多可用数据,但消费者的cpu使用率很高,那么就需要把该属性的值调大。<br> 2.如果消费者数量比较多,把该属性设置大一点可以降低broker的工作负载。</p><h5 id="fetch-max-wait-ms"><a href="#fetch-max-wait-ms" class="headerlink" title="fetch.max.wait.ms"></a>fetch.max.wait.ms</h5><p> 用于指定 broker的等待时间,默认是 500ms。如果没有足够的数据流入 Kafka,消费者获取最小数据量的要求就得不到满足,最终导致500ms的延迟。 如果要降低 潜在的延迟(为了满足 SLA),可以把该参数值设置得小一些。如果 fetch.max.wait.ms 被设为 1OOms,并且 fetch.min.bytes被设为 1MB,那么 Kafka在收到消费者的请求后,要么返 回 IMB 数据,要么在 1OOms 后返回所有可用的数据 ,就看哪个条件先得到满足。</p><h5 id="max-partition-fetch-bytes"><a href="#max-partition-fetch-bytes" class="headerlink" title="max.partition.fetch.bytes"></a>max.partition.fetch.bytes</h5><p> 指定了服务器从每个分区里返回给消费者的最大字节数。默认值为1MB,也就是说,kafkaConsumer.poll() 方法从每个分区里返回的记录最多不超过max.partition.fetch.bytes指定的字节。<br> eg:如果一个topic有20个partition和5个consumer,那么每个consumer需要至少4MB的可用内存来接收记录。<br> 经验:1.在为消费者分配内存时,可以给它们多分配一些,因为如果群组里有消费者发生崩溃,剩下的消费者需要处理更多的分区。<br> 2.max.partition.fetch.bytes的值必须大于broker能够接受的最大消息的字节数(max.message.size配置),否则消费者可能无法读取这些消息,导致消费者一直挂起重试。<br> 3.消费者需要频繁调用poll() 方法来避免会话过期和发生分区再均衡,如果单次调用poll() 返回的数据太多,消费者需要更多的时间来处理,可能无法及时进行下一个轮询来避免会话过期。如果出现这种情况可以把该属性值调小,或者延长会话过期时间。</p><h5 id="session-timeout-ms"><a href="#session-timeout-ms" class="headerlink" title="session.timeout.ms"></a>session.timeout.ms</h5><p> 指定了消费者可以多久不发送心跳,默认为3s。如果consumer没有在session.timeout.ms指定的时间内发送心跳给群组协调器,就被认为已经死亡,协调器就会触发再均衡。该属性与heartbeat.interval.ms紧密相关。heartbeat.interval.ms指定了poll() 方法向协调器发送心跳的频率。故,一般需要同时修改这两个属性,heartbeat.interval.ms必须比session.timeout.ms小,一般是session.timeout.ms的三分之一。<br> 经验:1.把session.timeout.ms值设得比默认值小,可以更快的检测和恢复崩溃的节点,不多长时间的轮询或垃圾收集可能导致非预期的再均衡。<br> 2.把session.timeout.ms值设得比默认值大,可以减少意外的再均衡,不过检测节点崩溃需要更长的时间。</p><h5 id="auto-offset-reset"><a href="#auto-offset-reset" class="headerlink" title="auto.offset.reset"></a>auto.offset.reset</h5><p> 指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下(因消费者长时间失效,包含的偏移量记录已经过时并被删除)该如何处理。默认值为latest,意思是说,在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)。另一个值是earliest,意思是说,在偏移量无效的情况下,消费者将从起始位置读取分区的记录。</p><h5 id="enable-autxo-commit"><a href="#enable-autxo-commit" class="headerlink" title="enable.autxo.commit"></a>enable.autxo.commit</h5><p> 指定了考费者是否自动提交偏移量,默认值为true。<br> 经验:1.为了尽量避免出现重复数据和数据丢失,可以把它设为 false,由 自 己控制何时提交偏移量。<br> 2.如果把它设为 t「ue,还可以通过配置 auto.commit.interval.ms 属性来控制提交的频率。</p><h5 id="partition-assignment-strategy"><a href="#partition-assignment-strategy" class="headerlink" title="partition.assignment.strategy"></a>partition.assignment.strategy</h5><p> PartitionAssignor根据给定的consumer和topic,决定哪些分区应该被分配给哪个消费者。Kafka有两个默认的分配策略。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1):Range</span><br><span class="line">该策略会把主题的若干个连续的分区分配给消费者。假设悄费者 Cl 和消费者 C2 同时 订阅了主题 Tl 和主题 T2,井且每个主题有 3 个分区。那么消费者 Cl 有可能分配到过 两个主题的分区 0 和 分区 i,而消费者 C2 分配到这两个 主题 的分区 2。因为每个主题 拥有奇数个分区,而分配是在主题内独立完成的,第一个消费者最后分配到比第二个消 费者更多的分区。只要使用了 Range策略,而且分区数量无怯被消费者数量整除,就会 出现这种情况。</span><br><span class="line"></span><br><span class="line">2):RoundRobin</span><br><span class="line">该策略把主题的所有分区逐个分配给消费者。如果使用 RoundRobin 策略来给消费者 Cl 和消费者 C2分配分区,那么消费者 Cl 将分到主题 Tl 的分区 0和分区 2以及主题 T2 的分区 1,消费者 C2 将分配到主题 Tl 的分区 l 以及主题口的分区 0和分区 2。一般 来说,如果所有消费者都订阅相同的主题(这种情况很常见), RoundRobin策略会给所 有消费者分配相同数量 的分区(或最多就差一个分区)。</span><br></pre></td></tr></table></figure><p> 可以通过设置 parti.ti.on.assi.gnl’lent.st「ategy 来选择分区策略。默认使用的是 0「g. apache.kafka.cli.ents.consul’le「.RangeAssi.gno「, 这个类实现了 Range策略,不过也可以 把它改成 。「g.apache.kafka.cli.ents.consul’le「.RoundRobi.nAssi.gnor。我们还可以使用自定 义策略,在这种情况下 , pa「t”i.ti.on.assi.gnl’lent.strategy 属性的值就是自定义类的名字。</p><h5 id="client-id"><a href="#client-id" class="headerlink" title="client.id"></a>client.id</h5><p> 该属性可以是任意字符串 , broker用它来标识从客户端发送过来的消息,通常被用在日志、度量指标和配额里。</p><h5 id="max-poll-records"><a href="#max-poll-records" class="headerlink" title="max.poll.records"></a>max.poll.records</h5><p> 该属性用于控制单次调用 call() 方住能够返回的记录数量,可以帮你控制在轮询里需要处理的数据量。</p><h5 id="receive-buffer-bytes和send-buffer-bytes"><a href="#receive-buffer-bytes和send-buffer-bytes" class="headerlink" title="receive.buffer.bytes和send.buffer.bytes"></a>receive.buffer.bytes和send.buffer.bytes</h5><p> socket 在读写数据时用到的 TCP 缓冲区也可以设置大小。如果它们被设为-1,就使用操作系统的默认值。如果生产者或消费者与broker处于不同的数据中心内,可以适当增大这些值因为跨数据中心的网络一般都有比较高的延迟和比较低的带宽。</p>]]></content>
<summary type="html">
<h5 id="基础配置:"><a href="#基础配置:" class="headerlink" title="基础配置:"></a>基础配置:</h5><pre><code>bootstrap.servers.group.id / key.deserializer / va
</summary>
<category term="Kafka" scheme="http://baidu.com/tags/Kafka/"/>
</entry>
<entry>
<title>Maven 依赖jar包下载失败解决方案</title>
<link href="http://baidu.com/2018/07/25/maven-jar-down-fail/"/>
<id>http://baidu.com/2018/07/25/maven-jar-down-fail/</id>
<published>2018-07-25T09:59:56.000Z</published>
<updated>2018-07-25T15:23:13.201Z</updated>
<content type="html"><![CDATA[<p>maven下载依赖jar包失败的解决方案</p><h3 id="第一个方法:删除本地的-repository库中所有-lastupdate后缀文件,重新下载"><a href="#第一个方法:删除本地的-repository库中所有-lastupdate后缀文件,重新下载" class="headerlink" title="第一个方法:删除本地的\repository库中所有.lastupdate后缀文件,重新下载"></a>第一个方法:删除本地的\repository库中所有.lastupdate后缀文件,重新下载</h3><pre><code>当我们使用eclipse下载jar包,有事突然退出,再次进入jar包还是下载不起可能的原因就是 maven没有将jar下载完时,会生成一个.lastupdate文件解决方法: 使用文件搜索工具(eg:Everything) 输入.lastupdate删除所有以.lastupdate结尾的文件。然后简单修改.pom(比如加空格) 保存,然后eclipse就会重新下载jar包!</code></pre><h3 id="第二个办法:maven添加镜像地址,编辑maven根目录中conf文件夹下settings-xml"><a href="#第二个办法:maven添加镜像地址,编辑maven根目录中conf文件夹下settings-xml" class="headerlink" title="第二个办法:maven添加镜像地址,编辑maven根目录中conf文件夹下settings.xml"></a>第二个办法:maven添加镜像地址,编辑maven根目录中conf文件夹下settings.xml</h3><h5 id="在-mirrors中增加"><a href="#在-mirrors中增加" class="headerlink" title="在 mirrors中增加"></a>在 mirrors中增加</h5><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">mirrors</span>></span> </span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">mirror</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>ibiblio.org<span class="tag"></<span class="name">id</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>ibiblio Mirror of http://repo1.maven.org/maven2/<span class="tag"></<span class="name">name</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://mirrors.ibiblio.org/pub/mirrors/maven2<span class="tag"></<span class="name">url</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span> </span><br><span class="line"> <span class="comment"><!-- United States, North Carolina --></span> </span><br><span class="line"> <span class="tag"></<span class="name">mirror</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">mirror</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>jboss-public-repository-group<span class="tag"></<span class="name">id</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>JBoss Public Repository Group<span class="tag"></<span class="name">name</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://repository.jboss.org/nexus/content/groups/public<span class="tag"></<span class="name">url</span>></span> </span><br><span class="line"> <span class="tag"></<span class="name">mirror</span>></span> </span><br><span class="line"><span class="tag"></<span class="name">mirrors</span>></span></span><br></pre></td></tr></table></figure><p>添加保存后,重新编辑pom文件,加个空格什么的,能下载部分jar包,还是有一些jar不能下载</p><h3 id="第三个办法:拷贝相应jar,手动导入本地库"><a href="#第三个办法:拷贝相应jar,手动导入本地库" class="headerlink" title="第三个办法:拷贝相应jar,手动导入本地库"></a>第三个办法:拷贝相应jar,手动导入本地库</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-config<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.4.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><p>Maven 安装 JAR 包的命令是:</p><p>mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar</p>]]></content>
<summary type="html">
<p>maven下载依赖jar包失败的解决方案</p>
<h3 id="第一个方法:删除本地的-repository库中所有-lastupdate后缀文件,重新下载"><a href="#第一个方法:删除本地的-repository库中所有-lastupdate后缀文件,重新下载
</summary>
<category term="maven" scheme="http://baidu.com/tags/maven/"/>
</entry>
<entry>
<title>Spring Boot与Spring Cloud版本对照</title>
<link href="http://baidu.com/2018/07/23/springCloud-version-diff/"/>
<id>http://baidu.com/2018/07/23/springCloud-version-diff/</id>
<published>2018-07-23T07:20:04.000Z</published>
<updated>2018-07-23T07:22:54.537Z</updated>
<content type="html"><![CDATA[<h2 id="Spring-Cloud版本对照如下:"><a href="#Spring-Cloud版本对照如下:" class="headerlink" title="Spring Cloud版本对照如下:"></a>Spring Cloud版本对照如下:</h2><table><thead><tr><th>Spring Cloud</th><th>Spring Boot</th></tr></thead><tbody><tr><td>1.2.x</td><td>Angel版本</td></tr><tr><td>1.3.x</td><td>Brixton版本</td></tr><tr><td>1.4.x</td><td>Camden版本</td></tr><tr><td>1.5.x</td><td>Dalston版本、Edgware版本</td></tr><tr><td>2.0.x</td><td>Finchley版本</td></tr><tr><td></td></tr></tbody></table><p>从下Angel到上Finchley可以看出,版本的第一个字母是按照A-Z顺序编排的。这些单词是什么含义呢,大概的搜一下可以得出基本都是地名,官方说明是这些版本号的单词来自于英国伦敦的地铁站站名。</p><p>那么为什么要用单词而不是数字类型的版本号呢?<br>因为Spring Cloud包含了一系列的子系统,Spring Cloud Config,Spring Cloud Netflix,Spring Cloud Bus等,为了防止与这些子系统的版本号混淆,Spring Cloud的版本号全部使用英文单词。</p><p>版本号后面的SRX,X代表一个数字,这个是小版本号,就是在特定的版本中,修复一些致命问题,做的升级版本号。</p>]]></content>
<summary type="html">
<h2 id="Spring-Cloud版本对照如下:"><a href="#Spring-Cloud版本对照如下:" class="headerlink" title="Spring Cloud版本对照如下:"></a>Spring Cloud版本对照如下:</h2><tabl
</summary>
<category term="Spring Cloud" scheme="http://baidu.com/tags/Spring-Cloud/"/>
</entry>
<entry>
<title>扩展阅读</title>
<link href="http://baidu.com/2018/06/29/ExpansionReading/"/>
<id>http://baidu.com/2018/06/29/ExpansionReading/</id>
<published>2018-06-29T14:29:50.000Z</published>
<updated>2018-06-29T14:31:30.857Z</updated>
<content type="html"><![CDATA[<ul><li>在互联网架构中,web服务器:一般指像nginx,apache这类服务器,他们一般只能解析静态资源;应用服务器:一般指像tomcat,jetty,resin这类的服务器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web服务器好。一般都是只有web服务器才能被外网访问,应用服务器只能内网访问。</li></ul><ul><li>对于js,css,image这类的静态资源可以考虑放到类似于阿里云的oss这类文件服务器上(如果是普通的服务器&操作系统,存储在到达pb级的文件后,或者单个文件夹内的文件数量达到3-5万,io会有很严重的性能问题),再在oss上配cdn(全国子节点加速),这样你页面打开的速度像飞一样,无论你在全国的哪个地方,并且你的nginx的负载也会进一步降低。</li></ul><ul><li>跨域问题,spring4的CORS可以完美解决,但一般使用nginx反向代理都不会有跨域问题,除非你把前端服务和后端服务分成两个域名。JSONP的方式已渐渐淘汰。</li></ul><ul><li>多端应用,应去掉tomcat原生的session机制,要使用token 机制,配合缓存(分布式系统)做单点,对于token机制的安全性问题,可以查阅jwt。</li></ul><ul><li>对于java工程师应该把精力放在java基础,设计模式,jvm原理,spring+springmvc原理及源码,linux,mysql事务隔离与所机制,redis,http/tcp,多线程,分布式架构(spring cloud),docker,kubernetes,安全,存储,业务方面等等。</li></ul>]]></content>
<summary type="html">
<ul>
<li>在互联网架构中,web服务器:一般指像nginx,apache这类服务器,他们一般只能解析静态资源;应用服务器:一般指像tomcat,jetty,resin这类的服务器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web服务器好。一般都是只有web
</summary>
<category term="其他" scheme="http://baidu.com/tags/%E5%85%B6%E4%BB%96/"/>
</entry>
<entry>
<title>公众号支付</title>
<link href="http://baidu.com/2018/06/29/wechatPay-fwh/"/>
<id>http://baidu.com/2018/06/29/wechatPay-fwh/</id>
<published>2018-06-29T09:56:55.000Z</published>
<updated>2018-06-29T15:56:46.994Z</updated>
<content type="html"><![CDATA[<h3 id="API列表"><a href="#API列表" class="headerlink" title="API列表"></a>API列表</h3><ul><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank" rel="noopener">统一下单</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2" target="_blank" rel="noopener">查询订单</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3" target="_blank" rel="noopener">关闭订单</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4" target="_blank" rel="noopener">申请退款</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5" target="_blank" rel="noopener">查询退款</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6" target="_blank" rel="noopener">下载对账单</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_8" target="_blank" rel="noopener">支付结果通知</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_10" target="_blank" rel="noopener">退款结果通知</a></li><li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_11" target="_blank" rel="noopener">拉取订单评价数据</a></li></ul><h3 id="场景介绍"><a href="#场景介绍" class="headerlink" title="场景介绍"></a>场景介绍</h3><ol><li><p>商户通过下发图文消息或者自定义菜单吸引用户点击进入商户网页(商城网站)</p></li><li><p>选择商品,进入订单支付页面</p></li><li><p>点击支付按钮,调起微信支付控件(JSAPI)</p></li><li><p>用户点击确认支付,开始输入支付密码</p></li><li><p>密码通过验证,支付成功(余额充足)。商户后台异步得到支付成功的通知</p></li><li><p>返回商户界面,显示购买成功。注:该页面由商户自定义</p></li><li><p>微信官方公众号下发支付凭证</p></li><li><p>商户公众号下发消息,例如:提示发货成功(该步骤可选)</p></li></ol><p><strong><em>支付场景交互细节</em></strong></p><ol><li><p>用户打开商户网站选购商品,发起支付请求–>商户服务器调用统一下单API获取预下单prepay_id返回网页–>在网页通过javaScript调用getBrandWCPayRequest接口,发起支付请求,用户进入支付流程</p></li><li><p>用户成功支付后,点击完成按钮,商户的前端会收到JavaScript的返回值。商户可根据该返回值跳转到相应的页面进行展示</p></li><li><p>商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功</p><p><strong><u>2、3步骤不保证遵循严格的时序 异步</u></strong></p></li></ol><h3 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h3><ul><li><p>线下—饮料售卖机…</p></li><li><p>线上—京东,淘宝,点赞猫…</p></li></ul><h3 id="开发步骤"><a href="#开发步骤" class="headerlink" title="开发步骤"></a>开发步骤</h3><p>一、<strong>设置支付目录</strong></p><p> ==公众号支付在请求支付的时候会校验请求来源是否有在商户平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,请求支付不成功。==</p><p><u>支付授权目录</u><strong>设置路径</strong>:</p><p> 商户平台–>产品中心–>开发配置</p><p> 如果支付授权目录没有设置正确,在请求JSAPI时,会提示“当前页面的url未注册”的错误。</p><p> 故:根据这个错误我们就可以知道,支付授权目录需配置为当前支付页面的上一级</p><p>二、<strong>设置网页授权域名</strong></p><p> 统一下单接口中要求必传openid参数,而获取openid需您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。</p><p> ==用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回调页面,回调页面需在此域名下,以保证安全可靠==</p><h5 id="业务流程"><a href="#业务流程" class="headerlink" title="业务流程"></a>业务流程</h5><p>引用微信官方时序图</p><p><img src="https://pay.weixin.qq.com/wiki/doc/api/img/chapter7_4_1.png" alt=""></p><p>商户系统和微信支付系统主要交互:</p><p>1、商户server调用统一下单接口请求订单,api参见公共api【<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank" rel="noopener">统一下单API</a>】</p><p>2、商户server接收支付通知,api参见公共api【<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7" target="_blank" rel="noopener">支付结果通知API</a>】</p><p>3、商户server查询支付结果,api参见公共api【<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2" target="_blank" rel="noopener">查询订单API</a>】</p><h5 id="获取微信版本号"><a href="#获取微信版本号" class="headerlink" title="获取微信版本号"></a>获取微信版本号</h5><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> wechatInfo = navigator.userAgent</span><br><span class="line"> .match(<span class="regexp">/MicroMessenger\/([\d\.]+)/i</span>);</span><br><span class="line"><span class="keyword">if</span> (!wechatInfo) {</span><br><span class="line"> alert(<span class="string">"本活动仅支持微信"</span>);</span><br><span class="line">} <span class="keyword">else</span> <span class="keyword">if</span> (wechatInfo[<span class="number">1</span>] < <span class="string">"5.0"</span>) {</span><br><span class="line"> alert(<span class="string">"本活动仅支持微信5.0以上版本"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>由于微信5.0版本后才加入微信支付模块,低版本用户调用微信支付功能将无效。因此,建议商户通过user agent来确定用户当前的版本号后再调用支付接口。以iPhone版本为例,可以通过user agent可获取如下微信版本示例信息:</p><p>“Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0”</p><h5 id="微信内H5调起支付"><a href="#微信内H5调起支付" class="headerlink" title="微信内H5调起支付"></a>微信内H5调起支付</h5><p>在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。</p><p>注意:WeixinJSBridge内置对象在其他浏览器中无效。</p><p><strong>列表中参数名区分大小,大小写错误签名验证会失败。</strong></p><p>getBrandWCPayRequest参数以及返回值定义:</p><p>1、<u>网页端接口请求参数列表</u></p><table><thead><tr><th>名称</th><th>变量名</th><th>必填</th><th>类型</th><th>示例值</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td>公众号id</td><td>appId</td><td>是</td><td>String(16)</td><td>wx8888888888888888</td><td style="text-align:left">商户注册具有支付权限的公众号成功后即可获得</td></tr><tr><td>时间戳</td><td>timeStamp</td><td>是</td><td>String(32)</td><td>1414561699</td><td style="text-align:left">当前的时间,其他详见<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2" target="_blank" rel="noopener">时间戳规则</a></td></tr><tr><td>随机字符串</td><td>nonceStr</td><td>是</td><td>String(32)</td><td>5K8264ILTKCH16CQ2502SI8ZNMTM67VS</td><td style="text-align:left">随机字符串,不长于32位。推荐<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3" target="_blank" rel="noopener">随机数生成算法</a></td></tr><tr><td>订单详情扩展字符串</td><td>package</td><td>是</td><td>String(128)</td><td>prepay_id=123456789</td><td style="text-align:left">统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***</td></tr><tr><td>签名方式</td><td>signType</td><td>是</td><td>String(32)</td><td>MD5</td><td style="text-align:left">签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致</td></tr><tr><td>签名</td><td>paySign</td><td>是</td><td>String(64)</td><td>C380BEC2BFD727A4B6845133519F3AD6</td><td style="text-align:left">签名,详见<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3" target="_blank" rel="noopener">签名生成算法</a></td></tr></tbody></table><p>参与签名参数为:appId、timeStamp、nonceStr、package、signType,请注意参数大小写。</p><p>2、<u>返回结果值说明</u></p><table><thead><tr><th>返回值</th><th>描述</th></tr></thead><tbody><tr><td>get_brand_wcpay_request:ok</td><td>支付成功</td></tr><tr><td>get_brand_wcpay_request:cancel</td><td>支付过程中用户取消</td></tr><tr><td>get_brand_wcpay_request:fail</td><td>支付失败</td></tr><tr><td>调用支付JSAPI缺少参数:total_fee</td><td>请检查预支付会话标识prepay_id是否已失效</td></tr></tbody></table><p>注:JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回。由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分。</p><p>示例代码如下:</p><p>function onBridgeReady(){<br> WeixinJSBridge.invoke(<br> ‘getBrandWCPayRequest’, {<br> “appId”:”wx2421b1c4370ec43b”, //公众号名称,由商户传入<br> “timeStamp”:”1395712654”, //时间戳,自1970年以来的秒数<br> “nonceStr”:”e61463f8efa94090b1f366cccfbbb444”, //随机串<br> “package”:”prepay_id=u802345jgfjsdfgsdg888”,<br> “signType”:”MD5”, //微信签名方式:<br> “paySign”:”70EA570631E4BB79628FBCA90534C63FF7FADD89” //微信签名<br> },<br> function(res){<br> if(res.err_msg == “get_brand_wcpay_request:ok” ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。<br> }<br> );<br>}<br>if (typeof WeixinJSBridge == “undefined”){<br> if( document.addEventListener ){<br> document.addEventListener(‘WeixinJSBridgeReady’, onBridgeReady, false);<br> }else if (document.attachEvent){<br> document.attachEvent(‘WeixinJSBridgeReady’, onBridgeReady);<br> document.attachEvent(‘onWeixinJSBridgeReady’, onBridgeReady);<br> }<br>}else{<br> onBridgeReady();<br>}</p><h5 id="微信收货地址共享"><a href="#微信收货地址共享" class="headerlink" title="微信收货地址共享"></a>微信收货地址共享</h5><p> 地址共享是基于微信JavaScript API 实现,只能在微信内置浏览器中使用,其他浏览器调用无效。同时,需要微信5.0 版本才能支持</p><p><strong>微信地址共享使用的数据字段:</strong> </p><ul><li>收货人姓名 </li><li>地区,省市区三级 </li><li>详细地址 </li><li>邮编 </li><li>联系电话 </li><li>其中,地区对应是国标三级地区码,如“广东省-广州市-天河区”,对应的邮编是510630</li></ul><p><strong>接口说明</strong></p><p>编辑并获取收货地址</p><p>编辑并获取用户收货地址需以JS-SDK方式调用,在网页前端调用。JS-SDK调用步骤见<a href="http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html" target="_blank" rel="noopener">说明文档</a>,需按文档要求完成调用。</p><p>特别注意:JS-SDK版本需使用<a href="http://res.wx.qq.com/open/js/jweixin-1.1.0.js" target="_blank" rel="noopener">http://res.wx.qq.com/open/js/jweixin-1.1.0.js</a></p><p>代码示例</p><p>wx.openAddress({<br> success: function () {<br> // 用户成功拉出地址 },<br> cancel: function () {<br> // 用户取消拉出地址<br>}});</p><table><thead><tr><th><strong>接口返回值</strong></th><th><strong>说明</strong></th></tr></thead><tbody><tr><td><u>errMsg</u></td><td>获取编辑收货地址成功返回“openAddress:ok”。</td></tr><tr><td><u>userName</u></td><td>收货人姓名。</td></tr><tr><td><u>postalCode</u></td><td>邮编。</td></tr><tr><td><u>provinceName</u></td><td>国标收货地址第一级地址(省)。</td></tr><tr><td><u>cityName</u></td><td>国标收货地址第二级地址(市)。</td></tr><tr><td><u>countryName</u></td><td>国标收货地址第三级地址(国家)。</td></tr><tr><td><u>detailInfo</u></td><td>详细收货地址信息。</td></tr><tr><td><u>nationalCode</u></td><td>收货地址国家码。</td></tr><tr><td><u>telNumber</u></td><td>收货人手机号码。</td></tr></tbody></table>]]></content>
<summary type="html">
<h3 id="API列表"><a href="#API列表" class="headerlink" title="API列表"></a>API列表</h3><ul>
<li><a href="https://pay.weixin.qq.com/wiki/doc/api/jsap
</summary>
<category term="微信开发" scheme="http://baidu.com/tags/%E5%BE%AE%E4%BF%A1%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>开篇词</title>
<link href="http://baidu.com/2018/06/27/kaipianci/"/>
<id>http://baidu.com/2018/06/27/kaipianci/</id>
<published>2018-06-27T15:32:55.000Z</published>
<updated>2018-06-29T15:30:16.967Z</updated>
<content type="html"><![CDATA[<blockquote><p> <u>Little Humor’s Blog开通啦,本博客旨在记录自己的学习点滴。结交五湖四海的朋友。</u></p></blockquote><p> <strong><em>写给自己</em></strong>:保持长时间学习,甚至终生学习的态度;不管例子多么简单,至少自己动手敲一遍看看是否理解了里头的细枝末节;学会思考,思考为什么要这样,而不是那样(最好举一反三);不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累,会在未来至少10年通用;回顾历史,看看历史时间栈上技术的发展,你才能明白明天会是什么样的。</p><hr><h5 id="理论知识"><a href="#理论知识" class="headerlink" title="理论知识"></a>理论知识</h5><p> 算法与数据结构、操作系统原理、编译原理、数据库原理、计算机原理……这些原理上的东西,是你想要成为一个专家必需要学的东西。这就是“工人”和“工程师”的差别,是“建筑工人”和“建筑架构师”的差别。如果你觉得这些理论上的东西无用,那么只能说明,你只不过在从事工人的工作,而不是工程师的工作。 </p><h5 id="技术能力"><a href="#技术能力" class="headerlink" title="技术能力"></a>技术能力</h5><p> 技术的东西都是死的,这些死的知识只要努力就是可以学会的。只不过聪明的人花得时间少,笨点的人花得时间多点罢了。这其中的时间差距主要是由学习方法的不同,基础知识储备的不同造成的。只要你的方法得当,多花点时间在基础知识上,会让你未来学习应用知识的时间大大缩短。以绝大多数人努力的程度,和为自己不努力找借口的程度为参考,只要你坚持正常的学习就可以超过大多数人了。 </p><hr><p> 《易经》有云:“取法其上,得乎其中;取法其中,得乎其下;取法其下,法不得也”。一起加油吧!</p><hr>]]></content>
<summary type="html">
<blockquote>
<p> <u>Little Humor’s Blog开通啦,本博客旨在记录自己的学习点滴。结交五湖四海的朋友。</u></p>
</blockquote>
<p> <strong><em>写给自己</em></strong>:保持长时间学习,甚至
</summary>
<category term="感悟" scheme="http://baidu.com/tags/%E6%84%9F%E6%82%9F/"/>
</entry>
</feed>