fengketrade/doc/建行相关App服务方接入文档v2.20_20250725.html

760 lines
323 KiB
HTML
Raw Normal View History

2025-10-20 15:29:15 +08:00
<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
.mac-os-11 { --title-bar-height:28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
body.typora-export { padding-left: 0px; padding-right: 0px; }
#write { padding-left: 20px; padding-right: 20px; }
.CodeMirror-sizer { margin-left: 0px !important; }
.CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
.typora-export #write { break-after: avoid; }
.typora-export #write::after { height: 0px; }
.is-mac table { break-inside: avoid; }
.typora-export-show-outline .typora-export-sidebar { display: none; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.6; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print {
.typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background: inherit; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) {
.typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) {
.typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ""; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
.md-inline-math-container mjx-container { zoom: 0.95; }
.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
span.cm-underlined { text-decoration: underline; }
span.cm-strikethrough { text-decoration: line-through; }
.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); }
.cm-tw-deleted { text-decoration: line-through; }
.cm-tw-header5 { font-weight: 700; }
.cm-tw-listitem:first-child { padding-left: 10px; }
.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; }
.cm-tw-underline { text-decoration: underline; }
@media print {
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}
:root {
--side-bar-bg-color: #fafafa;
--control-text-color: #777;
}
@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);
/* open-sans-regular - latin-ext_latin */
/* open-sans-italic - latin-ext_latin */
/* open-sans-700 - latin-ext_latin */
/* open-sans-700italic - latin-ext_latin */
html {
font-size: 16px;
-webkit-font-smoothing: antialiased;
}
body {
font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif;
color: rgb(51, 51, 51);
line-height: 1.6;
}
#write {
max-width: 860px;
margin: 0 auto;
padding: 30px;
padding-bottom: 100px;
}
@media only screen and (min-width: 1400px) {
#write {
max-width: 1024px;
}
}
@media only screen and (min-width: 1800px) {
#write {
max-width: 1200px;
}
}
#write > ul:first-child,
#write > ol:first-child{
margin-top: 30px;
}
a {
color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
position: relative;
margin-top: 1rem;
margin-bottom: 1rem;
font-weight: bold;
line-height: 1.4;
cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
text-decoration: none;
}
h1 tt,
h1 code {
font-size: inherit;
}
h2 tt,
h2 code {
font-size: inherit;
}
h3 tt,
h3 code {
font-size: inherit;
}
h4 tt,
h4 code {
font-size: inherit;
}
h5 tt,
h5 code {
font-size: inherit;
}
h6 tt,
h6 code {
font-size: inherit;
}
h1 {
font-size: 2.25em;
line-height: 1.2;
border-bottom: 1px solid #eee;
}
h2 {
font-size: 1.75em;
line-height: 1.225;
border-bottom: 1px solid #eee;
}
/*@media print {
.typora-export h1,
.typora-export h2 {
border-bottom: none;
padding-bottom: initial;
}
.typora-export h1::after,
.typora-export h2::after {
content: "";
display: block;
height: 100px;
margin-top: -96px;
border-top: 1px solid #eee;
}
}*/
h3 {
font-size: 1.5em;
line-height: 1.43;
}
h4 {
font-size: 1.25em;
}
h5 {
font-size: 1em;
}
h6 {
font-size: 1em;
color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
margin: 0.8em 0;
}
li>ol,
li>ul {
margin: 0 0;
}
hr {
height: 2px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
overflow: hidden;
box-sizing: content-box;
}
li p.first {
display: inline-block;
}
ul,
ol {
padding-left: 30px;
}
ul:first-child,
ol:first-child {
margin-top: 0;
}
ul:last-child,
ol:last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dfe2e5;
padding: 0 15px;
color: #777777;
}
blockquote blockquote {
padding-right: 0;
}
table {
padding: 0;
word-break: initial;
}
table tr {
border: 1px solid #dfe2e5;
margin: 0;
padding: 0;
}
table tr:nth-child(2n),
thead {
background-color: #f8f8f8;
}
table th {
font-weight: bold;
border: 1px solid #dfe2e5;
border-bottom: 0;
margin: 0;
padding: 6px 13px;
}
table td {
border: 1px solid #dfe2e5;
margin: 0;
padding: 6px 13px;
}
table th:first-child,
table td:first-child {
margin-top: 0;
}
table th:last-child,
table td:last-child {
margin-bottom: 0;
}
.CodeMirror-lines {
padding-left: 4px;
}
.code-tooltip {
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
border-top: 1px solid #eef2f2;
}
.md-fences,
code,
tt {
border: 1px solid #e7eaed;
background-color: #f8f8f8;
border-radius: 3px;
padding: 0;
padding: 2px 4px 0px 4px;
font-size: 0.9em;
}
code {
background-color: #f3f4f4;
padding: 0 2px 0 2px;
}
.md-fences {
margin-bottom: 15px;
margin-top: 15px;
padding-top: 8px;
padding-bottom: 6px;
}
.md-task-list-item > input {
margin-left: -1.3em;
}
@media print {
html {
font-size: 13px;
}
table,
pre {
page-break-inside: avoid;
}
pre {
word-wrap: break-word;
}
}
.md-fences {
background-color: #f8f8f8;
}
#write pre.md-meta-block {
padding: 1rem;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border: 0;
border-radius: 3px;
color: #777777;
margin-top: 0 !important;
}
.mathjax-block>.code-tooltip {
bottom: .375rem;
}
.md-mathjax-midline {
background: #fafafa;
}
#write>h3.md-focus:before{
left: -1.5625rem;
top: .375rem;
}
#write>h4.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h5.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h6.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
.md-image>.md-meta {
/*border: 1px solid #ddd;*/
border-radius: 3px;
padding: 2px 0px 0px 4px;
font-size: 0.9em;
color: inherit;
}
.md-tag {
color: #a7a7a7;
opacity: 1;
}
.md-toc {
margin-top:20px;
padding-bottom:20px;
}
.sidebar-tabs {
border-bottom: none;
}
#typora-quick-open {
border: 1px solid #ddd;
background-color: #f8f8f8;
}
#typora-quick-open-item {
background-color: #FAFAFA;
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
border-style: solid;
border-width: 1px;
}
/** focus mode */
.on-focus-mode blockquote {
border-left-color: rgba(85, 85, 85, 0.12);
}
header, .context-menu, .megamenu-content, footer{
font-family: "Segoe UI", "Arial", sans-serif;
}
.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
visibility: visible;
}
.mac-seamless-mode #typora-sidebar {
background-color: #fafafa;
background-color: var(--side-bar-bg-color);
}
.md-lang {
color: #b4654d;
}
/*.html-for-mac {
--item-hover-bg-color: #E6F0FE;
}*/
#md-notification .btn {
border: 0;
}
.dropdown-menu .divider {
border-color: #e5e5e5;
opacity: 0.4;
}
.ty-preferences .window-content {
background-color: #fafafa;
}
.ty-preferences .nav-group-item.active {
color: white;
background: #999;
}
.menu-item-container a.menu-style-btn {
background-color: #f5f8fa;
background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0));
}
</style><title>建行相关APP服务方接入文档(2)</title>
</head>
<body class='typora-export os-windows typora-export-show-outline typora-export-no-collapse-outline'><div class='typora-export-content'>
<div class="typora-export-sidebar"><div class="outline-content"><li class="outline-item-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#建行相关app服务方接入文档v22020250725">建行相关App服务方接入文档v2.20_20250725</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1-接入说明">1. 接入说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#2-服务方跳转说明">2. 服务方跳转说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#21-跳转url">2.1 跳转URL</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#22-建行相关app环境识别">2.2 建行相关App环境识别</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#221-建行生活app环境判断">2.2.1 建行生活App环境判断 </a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#222-中国建设银行app环境判断">2.2.2 中国建设银行App环境判断</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#23-加密串验证">2.3 加密串验证</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#3--建行相关app支付接入文档">3. 建行相关App支付接入文档</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#31-服务方调用收银台方法">3.1 服务方调用收银台方法</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#311-在建行生活app环境收银台调用">3.1.1 在建行生活App环境收银台调用</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1-iphone系统调用">(1) iPhone系统调用</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#2-android系统调用">(2) Android系统调用</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#312-在中国建设银行app环境收银台调用">3.1.2 在中国建设银行App环境收银台调用</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#32-支付成功页面回调设置">3.2 支付成功页面回调设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#33-其他说明">3.3 其他说明</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-
<span>例:</span></p><blockquote><p><span>Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/</span><strong><span>CloudMercWebView</span></strong></p></blockquote><p><strong><span>3使用以下方法获取userAgent并判断含有“CloudMercWebView”</span></strong></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="javascript"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="javascript"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">window</span>.<span class="cm-property">CCBBridge</span>.<span class="cm-property">requestNative</span>(<span class="cm-variable">JSON</span>.<span class="cm-property">stringify</span>({</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-property">action</span>: <span class="cm-string">"getUA"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-property">params</span>: {}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}), <span class="cm-string">"getUACallBackFund"</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 90px;"></div><div class="CodeMirror-gutters" style="display: none; height: 90px;"></div></div></div></pre><p><span>该js方法回调函数格式如下</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="javascript"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="javascript"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"><
<span>例如以下请求串被抓包截取后,不校验即可能越权访问客户信息:</span></p><blockquote><p><a href='https://ccb.wenyu6.com/api/ccb/user?platform=ccblife&amp;channel=mbs&amp;ccbParamSJ=SnU1d0F6bkNCSUZhUFAvL0xpK3FVNml3OHptcDViTnFIR3RlQjlhWldUUlNJbWNXbytpR0VFNHdIeWFuWTdWdFl1VVFQaFBrV3R6WQptY3JldURGOGVyNmFiQ3N0TFgyYU1QeGsrZmxWUFJ3VEZGWmR4d084V0NCYlJyWGNnVXptMUQ1amVoT3hEZ0U1amM4OHF1MXdqd0I2ClVMV0t3bENmOEw1aGtEZUJsMk5Db04wQWxHVXBuRkMzRk9vWENHSUdNSHNNVVRmK2ZHUEFzTmFsR25SWkZiTmt1M0I0YkM2YkxCOTUKdWV3RG9ESVpTU2hHbUJOMFZ6U3Z5SFIzUWx0Umg5T3hQeU03UmFzTTRVQWllZTRBandRL1YyNURXeGZrOWdDRWRRWEx4d2pkOWUTVqTFg2dU8rRldJNzJEQmp2UT09Cg%3D%3D&amp;CITYID=330100&amp;USERCITYID=440100' target='_blank' class='url'>https://ccb.wenyu6.com/api/ccb/user?platform=ccblife&channel=mbs&ccbParamSJ=SnU1d0F6bkNCSUZhUFAvL0xpK3FVNml3OHptcDViTnFIR3RlQjlhWldUUlNJbWNXbytpR0VFNHdIeWFuWTdWdFl1VVFQaFBrV3R6WQptY3JldURGOGVyNmFiQ3N0TFgyYU1QeGsrZmxWUFJ3VEZGWmR4d084V0NCYlJyWGNnVXptMUQ1amVoT3hEZ0U1amM4OHF1MXdqd0I2ClVMV0t3bENmOEw1aGtEZUJsMk5Db04wQWxHVXBuRkMzRk9vWENHSUdNSHNNVVRmK2ZHUEFzTmFsR25SWkZiTmt1M0I0YkM2YkxCOTUKdWV3RG9ESVpTU2hHbUJOMFZ6U3Z5SFIzUWx0Umg5T3hQeU03UmFzTTRVQWllZTRBandRL1YyNURXeGZrOWdDRWRRWEx4d2pkOWUTVqTFg2dU8rRldJNzJEQmp2UT09Cg%3D%3D&CITYID=330100&USERCITYID=440100</a></p></blockquote><p><span>可选校验方案如下:</span></p><ol start='' ><li><span>跳转访问时记录手机号或用户ID标识此次访问是否有效若为第一次访问则标识加密串已使用重复访问则为非法请求。</span></li><li><span>跳转访问时解密后TIMESTAMP字段跳转时间戳与当前服务器时间偏差需在5分钟之内否则为非法请求。</span></li></ol><br><h1 id='3--建行相关app支付接入文档'><span>3. </span><span id="chapter3"><span>建行相关App支付接入文档</span></span></h1><p><span>如服务方生活场景涉及支付环节必须按本章节要求完成文档所列建行相关App的支付接入使用建行生活收银台完成支付。</span></p><p><span>如服务方生活场景不涉及支付环节,可略过本章节。</span></p><h3 id='31-服务方调用收银台方法'><span>3.1 服务方调用收银台方法</span></h3><p><span>本章节说明了如何调起建行生活收银台如服务方生活场景涉及支付环节必须按本章节要求完成文档所列建行相关App调起建行生活收银台适配。</span></p><h4 id='311-在建行生活app环境收银台调用'><span>3.1.1 </span><span id="chapter3_1_1"><span>在建行生活App环境收银台调用</span></span></h4><p><span>由于平台的差异性Android 与iOS需用定义的js方法来调用建行生活收银台其中支付参数详见</span><a href='#chapter4'><span>《商户下单支付参数》</span></a><span>章节,以下为参考示例:</span><br/><font color=red><span>其中REMARK2填写服务方编号服务方编号一般为以YS开头的16位编号</span></font><span> </span></p><h5 id='1-iphone系统调用'><span>(1) iPhone系统调用</span></h5><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="javascript"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="javascript"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></di
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 注: callBackName是回调函数的名称可自行定义请先将回调函数挂载到window对象下该回调仅作为地址设置成功的参考。</span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 269px;"></div><div class="CodeMirror-gutters" style="display: none; height: 269px;"></div></div></div></pre><p><strong><span>此设置方法仅在建行生活App环境有效在中国建设银行App环境需在</span><a href='#chapter4'><span>《商户下单支付参数》</span></a><span>提供。</span></strong></p><p><span>支付成功跳转后设置的回调url会增加携带如下参数</span></p><figure><table><thead><tr><th><span>字段名</span></th><th><span>中文名</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>MERCHANTID</span></td><td><span>商户号</span></td><td>&nbsp;</td></tr><tr><td><span>POSID</span></td><td><span>柜台号</span></td><td>&nbsp;</td></tr><tr><td><span>ORDERID</span></td><td><span>订单号</span></td><td>&nbsp;</td></tr><tr><td><span>PAYMENT</span></td><td><span>订单金额</span></td><td>&nbsp;</td></tr><tr><td><span>SUCCESS</span></td><td><span>支付成功标识</span></td><td><span>固定为Y</span></td></tr><tr><td><span>REMARK2</span></td><td><span>支付备注二</span></td><td>&nbsp;</td></tr><tr><td><span>realPayment</span></td><td><span>实付金额</span></td><td><span>优惠后实际支付的金额</span></td></tr><tr><td><span>ccbParamSJ</span></td><td><span>用户信息加密串</span></td><td><span>与跳转服务方携带的相同</span></td></tr></tbody></table></figure><p><strong><span>最终支付结果请以服务器通知为准</span></strong></p><h3 id='33-其他说明'><span>3.3 其他说明</span></h3><ul><li><span>建行相关App根据订单信息调起支付。</span></li><li><span>在支付模块完成支付后,点击完成支付,关闭支付模块,跳转到支付成功页面。</span></li><li><span>支付成功结果最终以服务器通知为准。 </span></li></ul><p>&nbsp;</p><h1 id='4-商户下单支付参数文档'><span>4. </span><span id="chapter4"><span>商户下单支付参数文档</span></span></h1><p><span>如服务方生活场景涉及支付环节,必须按本章节要求完成支付参数组装。</span></p><p><span>如服务方生活场景不涉及支付环节,可略过本章节。</span></p><h3 id='41--商户-银行接口参数定义'><span>4.1 商户-&gt;银行接口参数定义</span></h3><figure><table><thead><tr><th><span>字段名</span></th><th><span>中文名</span></th><th><span>类型</span></th><th style='text-align:center;' ><span>是否非空</span></th><th style='text-align:center;' ><span>是否必送</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>MERCHANTID</span></td><td><span>商户代码</span></td><td><span>CHAR(15)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>F</span></td><td><span>由建行统一分配</span></td></tr><tr><td><span>POSID</span></td><td><span>柜台代码</span></td><td><span>CHAR(9)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>F</span></td><td><span>由建行统一分配9位柜台号</span></td></tr><tr><td><span>BRANCHID</span></td><td><span>分行代码</span></td><td><span>CHAR(9)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>F</span></td><td><span>由建行统一分配</span></td></tr><tr><td><span>POSID19</span></td><td><span>商户19位终端号</span></td><td><span>CHAR(19)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>由建行统一分配,使用微信支付时上送。</span><font color=red><span>仅作为参数传<EFBFBD>
<span>注3</span><code>是否必送</code><span>指该字段是否上送。T表示该字段必须上送无论是否有值F表示字段可以不送。</span>
<span>注4</span></p><ul><li><span>标注特定场景使用的字段(</span><font color=#999><span>灰色字体</span></font><span>),请根据需要上送,非必要则无需上送;某些字段仅对特定服务方可用,其他服务方上送无效。</span></li><li><span>标注在中国建设银行App环境使用的字段</span><font color=#5d9df7><span>蓝色字体</span></font><span>仅在手机银行场景上送时生效在建行生活APP内无效无需上送。</span></li></ul><p>&nbsp;</p><h3 id='42--md5摘要签名mac校验'><span>4.2 MD5摘要签名MAC校验</span></h3><p><span>采用标准MD5摘要算法对字符串数据签名</span><strong><span>32位小写</span></strong><span>),得到</span><code>MAC</code><span></span>
<span>注意和交易通讯报文的mac区分签名时不需要额外拼接privateKey</span></p><p><span>参与签名的字符串及其顺序如下(为上表中</span><code>MAC</code><span>字段之上的字段</span><strong><span>按顺序拼接</span></strong><span></span></p><blockquote><p><span>MERCHANTID=105910100194086&amp;POSID=313368474&amp;BRANCHID=441000000&amp;ORDERID=202209020000000061&amp;USER_ORDERID=202209020000000061&amp;PAYMENT=22.39&amp;CURCODE=01&amp;TXCODE=520100&amp;REMARK1=&amp;REMARK2=YS44000098000600&amp;TYPE=1&amp;GATEWAY=0&amp;CLIENTIP=&amp;REGINFO=&amp;PROINFO=&amp;REFERER=&amp;THIRDAPPINFO=comccbpay1234567890cloudmerchant&amp;TIMEOUT=20220902103420</span><font color=#FF6600><span>&amp;DCEP_MCT_TYPE=1</span></font><span>&amp;PLATFORMPUB=MIGfMA0GCSqGSIb......</span></p></blockquote><p><span>黑色字体对应的字段必须参与MAC</span><font color=#FF6600><span>橙色</span></font><span>的字段请根据需要上送且有值时才参与MAC否则无需参与MAC</span></p><h3 id='43--中文信息需要escape编码'><span>4.3 中文信息需要escape编码</span></h3><p><span>使用js的escape()方法对</span><code>REGINFO客户注册信息</code><span></span><code>PROINFO商品信息</code><span>进行编码,数字字母信息不需编码。 </span></p><p><span>例:</span>
<span>escape(小飞侠) = %u5C0F%u98DE%u4FA0</span>
<span>escape(A1级牛排) = A1%u7EA7%u725B%u6392</span></p><h3 id='44--商户公钥密文'><span>4.4 商户公钥密文</span></h3><p><code>ENCPUB</code><span>: 各服务方使用自己的</span><font color=#FF6600><span>服务方公钥</span></font><span></span><font color=red><span>商户公钥后30位</span></font><span>进行RSA加密再进行base64后生成的密文串。</span></p><p><strong><span>若商户已经上架建行生活并同步公钥,或是关联了外部平台商户号,可以不再上送商户公钥。</span></strong></p><p><span>注:公钥加密方法见《建行生活输入通讯报文接口规范》的</span><a href='#chapter6_4'><span>报文加密</span></a><span>章节。</span></p><h3 id='45-外部平台商户号说明'><span>4.5 外部平台商户号说明</span></h3><p><span>外部平台商户号用于服务方已在建行生活完成商户关联,且收款商户已上架建行生活,此时可以使用服务方关联的外部平台商户号来完成支付。</span>
<strong><span>使用外部平台商户号后,原建行商户号、柜台号、分行号无需上送。</span></strong>
<strong><span>若不使用外部平台商户号,则必须上送建行商户号、柜台号、分行号。</span></strong></p><h3 id='46-扩展域说明'><span>4.6 扩展域说明</span></h3><p><span>该字段仅提供给特定服务方场景使用内容为双方约定值格式为JSON字符串上送时需要encodeURI编码。</span>
<span>例:</span>
<span>善融积分:</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="javascript"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="javascript"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string">"scene"</span>: <span class="cm-string">"pointPay"</span>, <span class="cm-comment">// 场景</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string">"pointAmount"</span>: <span class="cm-string">"1.50"</span>, <span class="cm-comment">// 积分金额</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string">"pointNum"</span>: <span class="cm-string">"1050"</span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 积分数量</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 112px;"></div><div class="CodeMirror-gutters" style="display: none; height: 112px;"></div></div></div></pre><p><a href='#chapter8_3'><span>扩展域列表</span></a></p><h3 id='47-paybitmap和accountbitmap说明'><span>4.7 PAYBITMAP和ACCOUNTBITMAP说明</span></h3><p><span>PAYBITMAP和ACCOUNTBITMAP分别为</span><strong><span>定长10位数字</span></strong><span>的位图位图为1表示可用为0表示不可用。两个字段可单独使用未上送时默认全部支付方式都支持即全为11111111111</span></p><p><strong><span>PAYBITMAP</span></strong><span>:支付方式位图。第一位生活钱包支付,第二位龙支付,第三位微信支付,第四位数币支付,第五位信用付,第六位快贷支付,其余位图保留。</span>
<strong><span>ACCOUNTBITMAP</span></strong><span>:支付账户位图,仅对龙支付及生活钱包下的卡账户生效。第一位建行借记卡,第二位建行贷记卡,第三位他行借记卡,第四位为他行贷记卡,第五位为建行钱包,其余位图保留。</span></p><p><span>该位图字段在判断支付方式是否可用时优先级最低仅当商户已支持某一种支付方式时服务方可对其决定是否使用。例如商户不支持微信支付即使位图上送1也不会生效。</span></p><h3 id='48-orderid和userorderid说明'><span>4.8 ORDERID和USER_ORDERID说明</span></h3><p><code>ORDERID</code><span>:商户发起支付的流水号,用于建行收单支付流程,包括在支付、查询支付结果及退款交易中使用。</span>
<code>USER_ORDERID</code><span>:用户订单号,用于同步用户在建行生活中的订单状态,包括在订单推送及状态更新时使用。</span></p><ul><li><span>通常情况下若服务方对订单号没有特殊要求ORDERID与USER_ORDERID可以保持一致</span></li><li><span>考虑到存在一笔订单用户会多次发起支付的情况若服务方对同一笔订单每次发起支付的流水号要求不一样可以使用同一USER_ORDERID订单号对应不同ORDERID流水号来区分每笔支付交易。</span></li></ul><h3 id='49--最终参数串示例'><span>4.9 最终参数串示例</span></h3><p><strong><span>参与验签字符串+MD5码+服务方编号+商户公钥密文</span></strong></p><blockquote><p><span>MERCHANTID=105910100194086&amp;POSID=313368474&amp;BRANCHID=441000000&amp;ORDERID=202209020000000061&amp;USER_ORDERID=202209020000000061&amp;PAYMENT=22.39&amp;CURCODE=01&amp;TXCODE=520100&amp;REMARK1=&amp;REMARK2=YS44000098000600&amp;TYPE=1&amp;GATEWAY=0&amp;CLIENTIP=&amp;REGINFO=&amp;PROINFO=&amp;REFERER=&amp;THIRDAPPINFO=comccbpay1234567890cloudmerchant&amp;TIMEOUT=20220902103420</span><font color=#FF6600><span>&amp;DCEP_MCT_TYPE=1</span></font><span>&amp;MAC=f07ef63236e3bbbc1dc221b06e631f3d&amp;PLATFORMID=YS44000098000600</span><font color=#FF6600><span>&amp;ENCPUB=YzNxRGtKSkFYZURRczYvNDN6WVZkYk......</span></font></p></blockquote><p><span>详细信息可参考《支付下单串示例.xlsx》文件</span></p><br>
<br><h1 id='5--基本交易流程说明'><span>5. 基本交易流程说明</span></h1><h3 id='51-业务流程图'><span>5.1 业务流程图</span></h3><p><span>以建行生活App环境为例仅供参考</span>
<img src="./对接流程参考.png" referrerpolicy="no-referrer" alt="tree"></p><p><strong><span>重点步骤说明:</span></strong>
<code>步骤2</code><span>由服务方调用订单推送接口A3341O031向建行生活推送订单信息</span>
<code>步骤3</code><span>:参考</span><a href='#chapter3'><span>《建行相关App支付接入文档》</span></a><span>调用收银台</span>
<code>步骤10、11</code><span>:支付通知有两种推送方式,具体细节参考</span><a href='#chapter7'><span>《建行生活支付通知接口》</span></a><span></span></p><ul><li><span>方式1网银通知建行生活再由建行生活转发给服务方</span></li><li><span>方式2网银直接通知服务方</span></li></ul><p><code>步骤13、16</code><span>由服务方调用订单更新接口A3341O033向建行生活更新订单状态。</span>
<code>步骤14、15</code><span>服务方可以向外联平台主动查询订单交易流水判断订单的支付状态。外联平台接入请参考“外联接口网银或使用A3341O035</span></p><h1 id='6-建行生活输入通讯报文接口规范'><span>6. </span><span id="chapter6"><span>建行生活输入通讯报文接口规范</span></span></h1><h3 id='61-发送交易报文协议'><span>6.1 发送交易报文协议</span></h3><h5 id='1-服务方后台与建行生活后台交易报文协议'><span>(1) 服务方后台与建行生活后台交易报文协议</span></h5><p><span>建行生活后端交易采用HTTP Post 方式为对外通信协议。</span>
<span>访问地址示例:</span></p><blockquote><p><span>http://</span><strong><span>ip:port</span></strong><span>(域名)/standardxml_adapter/standardxmlchannelservlet</span></p></blockquote><p><span>调用HTTP Post方法</span>
<span>HTTP消息体内传输协议报文头、应用报文。</span></p><p>&nbsp;</p><p><span>建行生活后端新系统通讯地址A3341XXXX</span></p><figure><table><thead><tr><th><span>环境</span></th><th><span>地址</span></th></tr></thead><tbody><tr><td><span>测试环境</span></td><td><a href='http://124.127.94.60:18088/uat_new/tp_service/txCtrl/server?txcode=xxx' target='_blank' class='url'>http://124.127.94.60:18088/uat_new/tp_service/txCtrl/server?txcode=xxx</a></td></tr><tr><td><span>生产环境</span></td><td><a href='https://yunbusiness.ccb.com/tp_service/txCtrl/server?txcode=xxx' target='_blank' class='url'>https://yunbusiness.ccb.com/tp_service/txCtrl/server?txcode=xxx</a></td></tr></tbody></table></figure><h5 id='2-服务方前端与建行生活后台交易报文协议'><span>(2) 服务方前端与建行生活后台交易报文协议</span></h5><p><span>此方式仅适用于在</span><strong><span>中国建设银行App</span></strong><span>环境。前端以页面跳转的方式访问建行生活收银处理URL。</span></p><p><span>访问地址格式:</span></p><blockquote><p><span>url?txcode=A3341OM01&amp;svcid=aaaaaaaaa&amp;cnt=xxxxxx&amp;mac=yyyyyyy</span></p></blockquote><p><span>其中:</span></p><p><strong><span>txcode</span></strong><span>收银处理交易码固定为A3341OM01</span></p><p><strong><span>svcid</span></strong><span>为YS开头的服务方编号。</span></p><p><strong><span>cnt</span></strong><span>为将支付参数组装后含建行生活用户token详见支付SDK</span><a href='#chapter4'><span>《商户下单支付参数》</span></a><span>文档),用建行生活公钥进行加密后的</span><strong><span>RSA密文</span></strong><span>参数。</span></p><p><strong><span>mac</span></strong><span>为MD5签名32位大写注意与支付参数的MAC区分</span></p><blockquote><p><span>加解密及签名详见</span><a href='#chapter6_4_3'><span>《6.4.3 交易说明》</span></a><span></span><a href='#chapter6_4_4'><span>《6.4.4 加解密及签名方法》</span></a></p></blockquote><p><strong><span>url</span></strong><span>地址仅A3341OM01</span></p><figure><table><thead><tr><th><span>环境</span></th><th><span>地址</span></th></tr></thead><tbody><tr><td><span>测试环境</span></td><td><a href='http://124.127.94.60:18088/uat_new/clp_service/txCtrl' target='_blank' class='url'>http://124.127.94.60:18088/uat_new/clp_service/txCtrl</a></td></tr><tr><td><span>生产环境</span></td><td><a href='https://yunbusiness.ccb.com/clp_service/txCtrl' target='_blank' class='url'>https://yunbusiness.ccb.com/clp_service/txCtrl</a></td></tr></tbody></table></figure><p>&nbsp;</p><h3 id='62-报文规范'><span>6.2 报文规范</span></h3><h4 id='621-交易请求报文格式'><span>6.2.1 交易请求报文格式</span></h4><p><span>请求报文由两部分组成,交易请求报文头和交易请求报文体。其中交易请求报文头信息在报文头(</span><code>CLD_HEADER</code><span>)节点内,交易请求报文体信息在报文体(</span><code>CLD_BODY</code><span>)节点内。</span></p><h5 id='请求报文头字段说明'><span>请求报文头字段说明:</span></h5><figure><table><thead><tr><th><span>字段标识(报元号)</span></th><th><span>字段中文名</span></th><th><span>字段说明</span></th><th><span>数据属性</span></th><th><span>是否必填</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>CLD_TX_CHNL</span></td><td><span>报文来源渠道</span></td><td><span>消息来源渠道。</span></td><td><span>CHAR(20)</span></td><td><span>Y</span></td><td><span>以YS开头的服务方编号</span></td></tr><tr><td><span>CLD_TX_TIME</span></td><td><span>报文交易时间</span></td><td>&nbsp;</td><td><span>CHAR(14)</span></td><td><span>Y</span></td><td><span>上送交易时间,格式:yyyyMMddHHmmss</span></td></tr><tr><td><span>CLD_TX_CODE</span></td><td><span>交易服务ID</span></td><td>&nbsp;</td><td><span>CHAR(64)</span></td><td><span>Y</span></td><td><span><EFBFBD><EFBFBD>
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 246px;"></div><div class="CodeMirror-gutters" style="display: none; height: 246px;"></div></div></div></pre><h4 id='622-交易应答报文规范'><span>6.2.2 交易应答报文规范</span></h4><p><span>应答报文由两部分组成,交易应答报文头和交易应答报文体。其中交易应答报文头信息在报文头(</span><code>CLD_HEADER</code><span>)节点内,交易应答报文体信息在报文体(</span><code>CLD_BODY</code><span>)节点内。</span></p><h5 id='应答报文头字段说明'><span>应答报文头字段说明:</span></h5><figure><table><thead><tr><th><span>字段标识(报元号)</span></th><th><span>字段中文名</span></th><th><span>字段说明</span></th><th><span>数据属性</span></th><th><span>是否必填</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>CLD_TX_CHNL</span></td><td><span>报文来源渠道</span></td><td><span>消息来源渠道。</span></td><td><span>CHAR(20)</span></td><td><span>Y</span></td><td><span>以YS开头的服务方编号</span></td></tr><tr><td><span>CLD_TX_TIME</span></td><td><span>报文交易时间</span></td><td>&nbsp;</td><td><span>CHAR(14)</span></td><td><span>Y</span></td><td><span>上送交易时间,格式:yyyyMMddHHmmss</span></td></tr><tr><td><span>CLD_TX_CODE</span></td><td><span>交易服务ID</span></td><td>&nbsp;</td><td><span>CHAR(64)</span></td><td><span>Y</span></td><td><span>调用的交易名称</span></td></tr><tr><td><span>CLD_TX_SEQ</span></td><td><span>交易流水标识</span></td><td>&nbsp;</td><td><span>CHAR(32)</span></td><td><span>Y</span></td><td><span>用于标识唯一性</span></td></tr><tr><td><span>CLD_CODE</span></td><td><span>交易响应码</span></td><td>&nbsp;</td><td><span>CHAR(32)</span></td><td><span>Y</span></td><td>&nbsp;</td></tr><tr><td><span>CLD_DESC</span></td><td><span>交易响应内容</span></td><td>&nbsp;</td><td><span>CHAR(32)</span></td><td><span>Y</span></td><td>&nbsp;</td></tr></tbody></table></figure><p><strong><font size=4><span>应答报文体信息</span></font></strong></p><p><span>根据交易报文接口章节中每个交易的应答接口定义组装应答报文。</span></p><h5 id='应答报文样例'><span>应答报文样例:</span></h5><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 336px;"></div><div class="CodeMirror-gutters" style="display: none; height: 336px;"></div></div></div></pre><h4 id='623-报文编码说明'><span>6.2.3 报文编码说明</span></h4><p><span>报文使用</span><code>UTF-8</code><span>编码</span></p><h4 id='624-报文长度说明'><span>6.2.4 报文长度说明</span></h4><p><span>非二进制类型报元单个报元长度建议在9999位以内整体报文大小建议在20K以内考虑到客户登录类交易如果账户数量较多的情况登录类交易可以在2M以内</span></p><h4 id='625-报文结构及数据类型'><span>6.2.5 报文结构及数据类型</span></h4><p><span>对交易报文接口章节中的字段进行说明</span></p><h5 id='报文结构'><span>报文结构</span></h5><ul><li><span>数组</span></li></ul><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-string cm-property">"ADDR_LIST"</span>:[</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">"张杨路500号14楼"</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; ]</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 112px;"></div><div class="CodeMirror-gutters" style="display: none; height: 112px;"></div></div></div></pre><ul><li><span>结构</span>
<span>一个标签中还有子标签此标签没有重名的标签就代表一个结构属性p_type=&quot;G&quot;代表是一个复合类型。</span></li></ul><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-string cm-property">"SCI35022_0"</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string cm-property">"ADDR"</span>:<span class="cm-string">"张杨路500号14楼"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string cm-property">"ADDR_TYP"</span>:<span class="cm-string">"OFF"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string cm-property">"POSTCOD_TYP"</span>:<span class="cm-string">"200122"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string cm-property">"TEL_NO"</span>:<span class="cm-string">"13601735604"</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 179px;"></div><div class="CodeMirror-gutters" style="display: none; height: 179px;"></div></div></div></pre><ul><li><span>结构数组</span></li></ul><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 私钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">privateKey</span> <span class="cm-operator">=</span> <span class="cm-string">""</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* 加密及获取签名</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 源报文(未加密)</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">msg</span> <span class="cm-operator">=</span> <span class="cm-string">""</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 公钥加密得到密文并使用base64处理</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">enc_msg</span> <span class="cm-operator">=</span> <span class="cm-variable">RSAUtil</span>.<span class="cm-variable">encrypt</span>(<span class="cm-variable">msg</span>, <span class="cm-variable">publicKey</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">BASE64Encoder</span> <span class="cm-variable">encoder</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">BASE64Encoder</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">enc_msg</span> <span class="cm-operator">=</span> <span class="cm-variable">encoder</span>.<span class="cm-variable">encode</span>(<span class="cm-variable">enc_msg</span>.<span class="cm-variable">getBytes</span>(<span class="cm-string">"UTF-8"</span>));</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">enc_msg</span> <span class="cm-operator">=</span> <span class="cm-variable">enc_msg</span>.<span class="cm-variable">replaceAll</span>(<span class="cm-string">"\r\n"</span>, <span class="cm-string">""</span>).<span class="cm-variable">replaceAll</span>(<span class="cm-string">"\r"</span>, <span class="cm-string">""</span>).<span class="cm-variable">replaceAll</span>(<span class="cm-string">"\n"</span>, <span class="cm-string">""</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 根据源报文+私钥获得MD5签名</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">mac_info</span> <span class="cm-operator">=</span> <span class="cm-variable">MD5Util</span>.<span class="cm-variable">getMD5</span>(<span class="cm-variable">msg</span> <span class="cm-operator">+</span> <span class="cm-variable">privateKey</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* 解密及验签</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// base64逆处理并用私钥解密</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">BASE64Decoder</span> <span class="cm-variable">decoder</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">BASE64Decoder</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">enc_msg</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable-3">String</span>(<span class="cm-variable">decoder</span>.<span class="cm-variable">decodeBuffer</span>(<span class="cm-variable">enc_msg</span>),<span class="cm-string">"UTF-8"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">dec_msg</span> <span class="cm-operator">=</span> <span class="cm-variable">RSAUtil</span>.<span class="cm-variable">decrypt</span>(<span class="cm-variable">enc_msg</span>, <span class="cm-variable">privateKey</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 验签</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">dec_mac</span> <span class="cm-operator">=</span> <span class="cm-variable">MD5Util</span>.<span class="cm-variable">getMD5</span>(<span class="cm-variable">dec_msg</span> <span class="cm-operator">+</span> <span class="cm-variable">privateKey</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">if</span> (<span class="cm-variable">mac_info</span>.<span class="cm-variable">equals</span>(<span class="cm-variable">dec_mac</span>)) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">System</span>.<span class="cm-variable">out</span>.<span class="cm-variable">println</span>(<span class="cm-string">"验签通过"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">} <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">System</span>.<span class="cm-variable">out</span>.<span class="cm-variable">println</span>(<span class="cm-string">"验签失败"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 851px;"></div><div class="CodeMirror-gutters" style="display: none; height: 851px;"></div></div></div></pre><p><strong><span>提示</span></strong><span>如果使用的JDK版本高于1.8请将base64方法由sun.misc.BASE64Encoder替换为java.util.Base64,即</span>
<span>加密方法:</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="java"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="java"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// BASE64Encoder encoder = new BASE64Encoder();</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// enc_msg = encoder.encode(enc_msg.getBytes("UTF-8"));</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 替换为</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">Encoder</span> <span class="cm-variable">encoder</span> <span class="cm-operator">=</span> <span class="cm-variable">Base64</span>.<span class="cm-variable">getEncoder</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">enc_msg</span> <span class="cm-operator">=</span> <span class="cm-variable">encoder</span>.<span class="cm-variable">encodeToString</span>(<span class="cm-variable">enc_msg</span>.<span class="cm-variable">getBytes</span>(<span class="cm-string">"UTF-8"</span>));</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// RSAUtil.java: (new BASE64Encoder()).encodeBuffer(key) 替换为</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">Base64</span>.<span class="cm-variable">getEncoder</span>().<span class="cm-variable">encodeToString</span>(<span class="cm-variable">key</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 179px;"></div><div class="CodeMirror-gutters" style="display: none; height: 179px;"></div></div></div></pre><p><span>解密方法:</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="java"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="java"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// BASE64Decoder decoder = new BASE64Decoder();</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// enc_msg = new String(decoder.decodeBuffer(enc_msg), "UTF-8");</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// 替换为</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">Decoder</span> <span class="cm-variable">decoder</span> <span class="cm-operator">=</span> <span class="cm-variable">Base64</span>.<span class="cm-variable">getMimeDecoder</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">enc_msg</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable-3">String</span>(<span class="cm-variable">decoder</span>.<span class="cm-variable">decode</span>(<span class="cm-variable">enc_msg</span>), <span class="cm-string">"UTF-8"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// RSAUtil.java: (new BASE64Decoder()).decodeBuffer(key) 替换为</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">Base64</span>.<span class="cm-variable">getMimeDecoder</span>().<span class="cm-variable">decode</span>(<span class="cm-variable">key</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 179px;"></div><div class="CodeMirror-gutters" style="display: none; height: 179px;"></div></div></div></pre><p>&nbsp;</p><h1 id='7-建行生活支付通知接口'><span>7. </span><span id="chapter7"><span>建行生活支付通知接口</span></span></h1><p><span>如服务方生活场景涉及支付环节,必须按本章节要求完成支付回调通知对接。</span>
<strong><span>同时,因网络问题存在支付通知丢失的可能性,请服务方考虑通过主动查询支付流水的方式作为兜底,参考《建行生活输入通讯报文》服务方订单查询交易。</span></strong></p><p><span>如服务方生活场景不涉及支付环节,可略过本章节。</span></p><p>&nbsp;</p><p><strong><span>支付结果推送接口是特殊接口,属于建行生活主动推送给服务方,所以不会附带服务方编号。</span></strong>
<strong><span>服务方接收支付通知的系统地址,需要配置在建行生活运营后台,请联系运维进行配置。</span></strong></p><p><span>接口推送报文示例</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2002px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{<span class="cm-string cm-property">"ACC_TYPE"</span>: <span class="cm-string">"WX"</span>,<span class="cm-string cm-property">"BRANCHID"</span>: <span class="cm-string">"310000000"</span>,<span class="cm-string cm-property">"CCB_DISCOUNT_AMT"</span>: <span class="cm-string">""</span>,<span class="cm-string cm-property">"CCB_DISCOUNT_AMT_DESC"</span>: <span class="cm-string">""</span>,<span class="cm-string cm-property">"CLIENTIP"</span>: <span class="cm-string">"11.123.44.55"</span>,<span class="cm-string cm-property">"CURCODE"</span>: <span class="cm-string">"01"</span>,<span class="cm-string cm-property">"MRCH_ID"</span>: <span class="cm-string">""</span>,<span class="cm-string cm-property">"NT_TYPE"</span>: <span class="cm-string">"YS"</span>,<span class="cm-string cm-property">"ORDERID"</span>: <span class="cm-string">"210520133844test3yhv"</span>,<span class="cm-string cm-property">"PAYMENT"</span>: <span class="cm-string">"0.01"</span>,<span class="cm-string cm-property">"PAY_TYPE"</span>: <span class="cm-string">"01"</span>,<span class="cm-string cm-property">"POSID"</span>: <span class="cm-string">"123442025"</span>,<span class="cm-string cm-property">"REFERER"</span>: <span class="cm-string">""</span>,<span class="cm-string cm-property">"REMARK1"</span>: <span class="cm-string">""</span>,<span class="cm-string cm-property">"REMARK2"</span>: <span class="cm-string">"YS1234009000111**WXZF"</span>,<span class="cm-string cm-property">"SIGN"</span>:<span class="cm-string">"1a4aca34f02c0efab014ff823153a2a07a35a8a8410591a992d4aa9cd7fa1f961b952236a45b4fe37867ad4a7214ecbeae21957dee9c19d3d2f5dcf09c8faca81ceb68119c8dcd53bd1e70c23f60fc03e7cd96b8c0082a1243d688c13aac0bcd9e177c559e40e782e3856ada32de8d8ce0054e35fca2022b8f91b2a1ca2c5e10"</span>,<span class="cm-string cm-property">"SUCCESS"</span>: <span class="cm-string">"Y"</span>,<span class="cm-string cm-property">"TYPE"</span>: <span class="cm-string">"1"</span>}</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 179px;"></div><div class="CodeMirror-gutters" style="display: none; height: 179px;"></div></div></div></pre><p><span>发起支付时(</span><a href='#chapter4'><span>调用商户下单支付接口</span></a><span>),把服务方编号通过</span><code>REMARK2</code><span>字段送
<span>注2需要使用服务方公钥解密的字段仅当由建行生活转发支付通知时会存在</span></p><h4 id='721-usrinfo字段说明'><span>7.2.1 USRINFO字段说明</span></h4><figure><table><thead><tr><th><span>信息返回开关</span></th><th><span>证件号返回开关</span></th><th><span>手机号返回开关</span></th><th><span>返回值</span></th></tr></thead><tbody><tr><td><span></span></td><td><span></span></td><td><span></span></td><td><span>USRINFO =</span><strong><span>证件号密文</span><span>|</span><span>手机号密文</span></strong></td></tr><tr><td><span></span></td><td><span></span></td><td><span></span></td><td><span>USRINFO =</span><strong><span>证件号密文</span></strong></td></tr><tr><td><span></span></td><td><span></span></td><td><span></span></td><td><span>USRINFO =</span><strong><span>手机号密文</span></strong></td></tr><tr><td><span></span></td><td><span></span></td><td><span></span></td><td><span>USRINFO =</span></td></tr><tr><td><span></span></td><td><span>开\关</span></td><td><span>开\关</span></td><td><span>不返回USRINFO</span></td></tr><tr><td><strong><span>系统编码为ISO-8859-1服务方处理时请注意编码问题。</span></strong></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table></figure><h4 id='722-usrmsg字段说明'><span>7.2.2 USRMSG字段说明</span></h4><p><span>使用对称加密算法对“户名|账号”进行加密后通过商户通知接口传送到商户系统对称加密的密钥为建行生活为场景服务方分配的专门用于支付通知的公钥后30位【</span><strong><span>注意区别于在商户服务平台下载的柜台公钥</span></strong><span>】。如:</span></p><blockquote><p><span>密钥f6528d5c335b7092fc9ec1b3020111</span>
<span>原串:梅九六|6214662020019275</span>
<span>加密串AWWo2KKeATj6XxRglo7uaR0yZ2QQtCW%2C</span>
<span>使用MCipherDecode.java类中的getDecodeString(String urlString)方法进行解密,主要步骤如下:</span></p></blockquote><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="java"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="java"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">MCipherDecode</span> <span class="cm-variable">mcd</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">MCipherDecode</span>(<span class="cm-variable">key</span>);<span class="cm-comment">// 设置密钥</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">decodedString</span> <span class="cm-operator">=</span> <span class="cm-variable">mcd</span>.<span class="cm-variable">getDecodeString</span>(<span class="cm-variable">cipherdURL</span>);<span class="cm-comment">// 解密</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">byte</span>[] <span class="cm-variable">tempByte</span> <span class="cm-operator">=</span> <span class="cm-variable">decodedString</span>.<span class="cm-variable">getBytes</span>(<span class="cm-string">"ISO-8859-1"</span>); </span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">String</span> <span class="cm-variable">a</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable-3">String</span>(<span class="cm-variable">tempByte</span>,<span class="cm-string">"GBK"</span>); <span class="cm-comment">// 进行字符转码</span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 90px;"></div><div class="CodeMirror-gutters" style="display: none; height: 90px;"></div></div></div></pre><p><strong><span>系统编码为ISO-8859-1商户处理时请注意编码问题。</span></strong></p><p><span>1支付详细信息字段说明</span></p><figure><table><thead><tr><th><span>参数</span></th><th><span>参数名称</span></th><th><span>长度</span></th><th><span>是否必输</span></th><th><span>参数说明</span></th><th><span>样例</span></th></tr></thead><tbody><tr><td><span>TYPE</span></td><td><span>支付方式</span></td><td><span>10</span></td><td><span>N</span></td><td><span>枚举值 支付宝ALIPAY、微信WEIXIN、建行CCB、银联UNIONPAY暂不支付</span></td><td><span>ALIPAY</span></td></tr><tr><td><span>PAY_CHANNEL</span></td><td><span><EFBFBD>
<span>4.1 将</span><strong><span>netpay.jar</span></strong><span>引用至java开发工程中。netpay.jar可在附件文件夹中获取</span>
<span>4.2 </span><strong><span>CCBSign.RSASig</span></strong><span>是签名包的封装类,验签时使用此类即可:</span></li></ol><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="java" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="java"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* Method: setPublicKey</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* description: 设置验签用公钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* @param pkey</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 商户的公钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* @return 无</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">setPublicKey</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">pkey</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* Method: verifySigature</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* description: 验证签名</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* @param sign</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 建行返回的sign签名</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* @param src</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 签名前的源串例如POSID=000000&amp;BRANCHID=110000000&amp;ORDERID=00320995&amp;PAYMENT=0.01&amp;CURCODE=01&amp;REMARK1=test1&amp;REMARK2=test2&amp;SUCCESS=Y</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" class="cm-tab-wrap-hack" style="padding-right: 0.1px;"><span class="cm-comment">* @return true-验证通过<span class="cm-tab" role="presentation" cm-text=" "> </span>false-验证失败</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">boolean</span> <span class="cm-def">verifySigature</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">sign</span>,<span class="cm-variable-3">String</span> <span class="cm-variable">src</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 538px;"></div><div class="CodeMirror-gutters" style="display: none; height: 538px;"></div></div></div></pre><p><em><span></span></em><span></span></p><ul><li><span>当NT_TYPE=</span><strong><span>YS</span></strong><span>时,使用建行生活分配的服务商支付验签公钥转换后进行验签 (注意与服务方公私钥相区分)</span></li><li><span>当NT_TYPE=</span><strong><span>CCB</span></strong><span>时,使用商户服务平台下载的商户公钥进行验签</span></li></ul><h4 id='724-ccbdiscountamt和ccbdiscountamtdesc字段说明'><span>7.2.4 CCB_DISCOUNT_AMT和CCB_DISCOUNT_AMT_DESC字段说明</span></h4><p><span>这两个字段为加密字段,加密方式 RSAUtil.encrypt-&gt;BASE64Encoder(UTF-8,并处理换行)【即建行生活接口的</span><a href='#chapter6_4'><span>加密方式</span></a><span>】。</span>
<code>CCB_DISCOUNT_AMT</code><span>为在建行网关支付产生的优惠总额,商户可以根据(订单金额 - 优惠总额)得到实付金额</span>
<code>CCB_DISCOUNT_AMT_DESC</code><span>为优惠明细,格式为:优惠名称=优惠金额|@|优惠名称=优惠金额 (多种优惠以</span><code>|@|</code><span>分隔)</span></p><h4 id='725-mrchid字段说明'><span>7.2.5 MRCH_ID字段说明</span></h4><p><span>该字段为加密字段,加密方式 RSAUtil.encrypt-&gt;BASE64Encoder(UTF-8,并处理换行)【即建行生活接口的</span><a href='#chapter6_4'><span>加密方式</span></a><span>】。</span></p><h4 id='725-crcrdinstmprdnum和bigamtinstmhdcg字段说明'><span>7.2.5 CRCRD_INSTM_PRD_NUM和BIGAMT_INSTM_HDCG字段说明</span></h4><p><span>当商户使用商户侧分期支付时,额外返回这两个相关字段。</span>
<span>该字段为加密字段,加密方式 RSAUtil.encrypt-&gt;BASE64Encoder(UTF-8,并处理换行)【即建行生活接口的</span><a href='#chapter6_4'><span>加密方式</span></a><span>】。</span></p><h1 id='8-建行生活退款操作通知接口不能用于退款结果判断'><span>8. </span><span id="chapter8"><span>建行生活退款操作通知接口(</span><font color=red><span>不能用于退款结果判断</span></font><span>)</span></span></h1><p><span>如服务方场景需要接收退款操作消息通知,必须按本章节要求完成退款回调通知对接。</span>
<strong><span>不同于支付结果推送退款操作消息推送仅推送商户号、订单号等少量用于查询使用的信息若需获知退款状态、金额、优惠信息和支付方式等信息参考《建行生活输入通讯报文》服务方订单查询交易A3341TP03</span></strong></p><p><span>如服务方场景不涉及退款环节或仅通过A3341TP04服务方退款交易完成退款已实现退款流程的闭环可略过本章节。</span></p><p>&nbsp;</p><p><strong><span>订单退款操作消息推送属于建行生活主动推送给服务方,所以不会附带服务方编号。</span></strong>
<strong><span>服务方接收退款操作消息通知的回调地址,需要配置在建行生活运营后台,请联系运维进行配置。</span></strong></p><p><span>接口推送报文示例</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.19922px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{<span class="cm-string cm-property">"MRCH_ID"</span>: <span class="cm-string">"1050000000000000000"</span>,<span class="cm-string cm-property">"NT_TYPE"</span>: <span class="cm-string">"YS"</span>,<span class="cm-string cm-property">"ORDERID"</span>: <span class="cm-string">"210520133844test3yhv"</span>,<span class="cm-string cm-property">"REFUND_DTM"</span>: <span class="cm-string">"20250601120000"</span>, <span class="cm-string cm-property">"SIGN"</span> : <span class="cm-string">"317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859"</span>}</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 134px;"></div><div class="CodeMirror-gutters" style="display: none; height: 134px;"></div></div></div></pre><h3 id='81-背景描述'><span>8.1 背景描述</span></h3><p><span>对于服务方已支付成功的订单,</span><font color=red><span>存在商户直接去商户服务平台退款的情况,此时服务方无法获悉退款操作</span></font><span></span>
<span>可能导致服务方订单状态与实际不一致以及用户在服务方场景权益未退回等情况。</span>
<span>建行生活支持将服务方下单场景商户的退款操作消息通知给服务方,</span>
<span>服务方可基于该消息去查询A3341TP03服务方订单查询接口判断用户是否发生了退款以及退款金额等信息</span>
<span>并推送正确的订单状态,使整个交易链路闭环,确保订单状态的一致性。</span></p><h3 id='82-字段描述'><span>8.2 </span><span id="chapter8_2"><span>字段描述</span></span></h3><figure><table><thead><tr><th><span>字段名</span></th><th><span>中文名</span></th><th><span>类型</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>NT_TYPE</span></td><td><span>支付服务通知类型</span></td><td><span>CHAR(9)</span></td><td><span>当该字段有值且为为</span><code>YS</code><span>时,则表示此通知是由建行生活加签后发出。当该字段为</span><code>CCB</code><span>或为空时,则表示此通知是由建行原始通知加签后发出。</span><br><strong><span>该字段不参与签名</span></strong></td></tr><tr><td><strong><span>ORDERID</span></strong></td><td><span>支付流水号</span></td><td><span>CHAR(30)</span></td><td><span>拉起收银台时上送的ORDERID</span></td></tr><tr><td><strong><span>MRCH_ID</span></strong></td><td><span>商户号</span></td><td><span>CHAR(256)</span></td><td><span>商户编号</span><br></td></tr><tr><td><strong><span>REFUND_DTM</span></strong></td><td><span>退款时间</span></td><td><span>CHAR(14)</span></td><td><span>退款时间。</span><font color=red><span>时间格式yyyyMMddHHmmss</span></font></td></tr></tbody></table></figure><p><span>注:除不参与签名的字段外,</span><strong><span>加粗</span></strong><span>字段为验签时必输字段</span></p><p><strong><span>签名运算原串</span></strong></p><p><span>参与签名运算的字符串及其顺序如下:</span></p><blockquote><p><span>ORDERID=210520133844test3yhv&amp;MRCH_ID=1050000000000000000&amp;REFUND_DTM=20250601120000</span></p></blockquote><p><span>注:字符串中变量名必须是大写字母。</span></p><h4 id='821-sign字段说明'><span>8.2.1 SIGN字段说明</span></h4><ol start='' ><li><span>获取待签名数据,待签名数据中的字段顺序请参考上述的字段域,字段是否参与签名及顺序请参考</span><a href='#chapter8_2'><span>字段描述</span></a><span> </span></li></ol><p><span>例1</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="json"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.20117px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{<span class="cm-string cm-property">"MRCH_ID"</span>: <span class="cm-string">""</span>,<span class="cm-string cm-property">"NT_TYPE"</span>: <span class="cm-string">"YS"</span>,<span class="cm-string cm-property">"ORDERID"</span>: <span class="cm-string">"210520133844test3yhv"</span>,<span class="cm-string cm-property">"POSID"</span>: <span class="cm-string">"123442025"</span>,<sp
<span>使用具有唯一性的交易流水号即可,不要求编码方式</span>
<strong><span>行内服务方</span></strong><span></span>
<span>流水号(全局事件跟踪号)采用4段28位编码方式如下图所示</span>
<img src="https://img-blog.csdnimg.cn/20210517171102739.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4MTU0NDg1NA==,size_16,color_FFFFFF,t_70" referrerpolicy="no-referrer" alt="platFlowNo"></p><ul><li><span>第一段长度为6位渠道代号由建行生活为各接入通讯渠道分配</span></li><li><span>第二段长度为2位通讯渠道方为发送机器进行编号定义</span></li><li><span>第三段长度为14位是纯数字的时间标签精确到秒格式为yyyyMMddHHmmss即假设当前时间为2019-2-23 15:47:26那标签为20190223154726。</span></li><li><span>第四段长度为6位为序列号由机器自身的序列号生成器产生从0开始递增每取出一个序列号后即向上加1直至到达999999之后循环从0重复开始。序列号应该与时间是不相关的禁止到达某一时间点即对序列号清零因为机器的系统时间会被手动调整或自动同步而可能出现相同的时间。</span></li></ul><h3 id='93-拓展域列表'><span>9.3 </span><span id="chapter9_3"><span>拓展域列表</span></span></h3><p><span>善融积分:</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="javascript"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="javascript"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.2px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string">"scene"</span>: <span class="cm-string">"pointPay"</span>, <span class="cm-comment">// 场景</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string">"pointAmount"</span>: <span class="cm-string">"1.50"</span>, <span class="cm-comment">// 积分金额</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string">"pointNum"</span>: <span class="cm-string">"1050"</span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 积分数量</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 112px;"></div><div class="CodeMirror-gutters" style="display: none; height:
</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">security</span>.<span class="cm-variable">MessageDigest</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">public</span> <span class="cm-keyword">class</span> <span class="cm-def">MD5Util</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 生成MD5</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">String</span> <span class="cm-variable">getMD5</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">message</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">String</span> <span class="cm-variable">md5</span> <span class="cm-operator">=</span> <span class="cm-string">""</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">MessageDigest</span> <span class="cm-variable">md</span> <span class="cm-operator">=</span> <span class="cm-variable">MessageDigest</span>.<span class="cm-variable">getInstance</span>(<span class="cm-string">"MD5"</span>); <span class="cm-comment">// 创建一个md5算法对象</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">byte</span>[] <span class="cm-variable">messageByte</span> <span class="cm-operator">=</span> <span class="cm-variable">message</span>.<span class="cm-variable">getBytes</span>(<span class="cm-string">"UTF-8"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">byte</span>[] <span class="cm-variable">md5Byte</span> <span class="cm-operator">=</span> <span class="cm-variable">md</span>.<span class="cm-variable">digest</span>(<span class="cm-variable">messageByte</span>); <span class="cm-comment">// 获得MD5字节数组,16*8=128位</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">md5</span> <span class="cm-operator">=</span> <span class="cm-variable">bytesToHex</span>(<span class="cm-variable">md5Byte</span>); <span class="cm-comment">// 转换为16进制字符串</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">return</span> <span class="cm-variable">md5</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span>}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 二进制转十六进制</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">private</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">String</span> <span class="cm-variable">bytesToHex</span>(<span class="cm-variable-3">byte</span>[] <span class="cm-variable">bytes</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">StringBuffer</span> <span class="cm-variable">hexStr</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable-3">StringBuffer</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">int</span> <span class="cm-variable">num</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">for</span> (<span class="cm-variable-3">int</span> <span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>; <span class="cm-variable">i</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">bytes</span>.<span class="cm-variable">length</span>; <span class="cm-variable">i</span><span class="cm-operator">++</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">num</span> <span class="cm-operator">=</span> <span class="cm-variable">bytes</span>[<span class="cm-variable">i</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">if</span> (<span class="cm-variable">num</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">num</span> <span class="cm-operator">+=</span> <span class="cm-number">256</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span>}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span
</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">io</span>.<span class="cm-variable">ByteArrayOutputStream</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">security</span>.<span class="cm-variable">Key</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">security</span>.<span class="cm-variable">KeyFactory</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">security</span>.<span class="cm-variable">spec</span>.<span class="cm-variable">PKCS8EncodedKeySpec</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">security</span>.<span class="cm-variable">spec</span>.<span class="cm-variable">X509EncodedKeySpec</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">javax</span>.<span class="cm-variable">crypto</span>.<span class="cm-variable">Cipher</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">sun</span>.<span class="cm-variable">misc</span>.<span class="cm-variable">BASE64Decoder</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">sun</span>.<span class="cm-variable">misc</span>.<span class="cm-variable">BASE64Encoder</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">public</span> <span class="cm-keyword">class</span> <span class="cm-def">RSAUtil</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* 加密算法RSA</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">private</span> <span class="cm-keyword">static</span> <span class="cm-keyword">final</span> <span class="cm-variable-3">String</span> <span class="cm-variable">KEY_ALGORITHM</span> <span class="cm-operator">=</span> <span class="cm-string">"RSA"</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* RSA最大加密明文大小</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">private</span> <span class="cm-keyword">static</span> <span class="cm-keyword">final</span> <span class="cm-variable-3">int</span> <span class="cm-variable">MAX_ENCRYPT_BLOCK</span> <span class="cm-operator">=</span> <span class="cm-number">117</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* RSA最大解密密文大小</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">private</span> <span class="cm-keyword">static</span> <span class="cm-keyword">final</span> <span class="cm-variable-3">int</span> <span class="cm-variable">MAX_DECRYPT_BLOCK</span> <span class="cm-operator">=</span> <span class="cm-number">128</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* Method: decryptBASE64 </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* description: 解码返回byte </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param key</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @return</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @throws Exception</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">byte</span>[] <span class="cm-variable">decryptBASE64</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">key</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">return</span> (<span class="cm-keyword">new</span> <span class="cm-variable">BASE64Decoder</span>()).<span class="cm-variable">decodeBuffer</span>(<span class="cm-variable">key</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span>}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* Method: encryptBASE64 </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* description: 编码返回字符串 </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param key</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @return</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @throws Exception</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">String</span> <span class="cm-variable">encryptBASE64</span>(<span class="cm-variable-3">byte</span>[] <span class="cm-variable">key</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">return</span> (<span class="cm-keyword">new</span> <span class="cm-variable">BASE64Encoder</span>()).<span class="cm-variable">encodeBuffer</span>(<span class="cm-variable">key</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span>}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* 获取base64加密后的字符串的原始公钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param keyStr</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @return</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @throws Exception</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable">Key</span> <span class="cm-variable">getPublicKeyFromBase64KeyEncodeStr</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">keyStr</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">byte</span>[] <span class="cm-variable">keyBytes</span> <span class="cm-operator">=</span> <span class="cm-variable">decryptBASE64</span>(<span class="cm-variable">keyStr</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 取得公钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">X509EncodedKeySpec</span> <span class="cm-variable">x509KeySpec</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">X509EncodedKeySpec</span>(<span class="cm-variable">keyBytes</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">Key</span> <span class="cm-variable">publicKey</span> <span class="cm-operator">=</span> <span class="cm-variable">KeyFactory</span>.<span class="cm-variable">getInstance</span>(<span class="cm-variable">KEY_ALGORITHM</span>).<span class="cm-variable">generatePublic</span>(<span class="cm-variable">x509KeySpec</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presen
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* 获取base64加密后的字符串的原始私钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param keyStr</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @return</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @throws Exception</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable">Key</span> <span class="cm-variable">getPrivateKeyFromBase64KeyEncodeStr</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">keyStr</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">byte</span>[] <span class="cm-variable">keyBytes</span> <span class="cm-operator">=</span> <span class="cm-variable">decryptBASE64</span>(<span class="cm-variable">keyStr</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 取得私钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">PKCS8EncodedKeySpec</span> <span class="cm-variable">pkcs8KeySpec</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">PKCS8EncodedKeySpec</span>(<span class="cm-variable">keyBytes</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">Key</span> <span class="cm-variable">privateKey</span> <span class="cm-operator">=</span> <span class="cm-variable">KeyFactory</span>.<span class="cm-variable">getInstance</span>(<span class="cm-variable">KEY_ALGORITHM</span>).<span class="cm-variable">generatePrivate</span>(<span class="cm-variable">pkcs8KeySpec</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role=
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* Method: encrypt </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* description: 公钥分段加密 </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param dataStr</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 加密内容,明文</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param publicKeyStr</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 公钥内容</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @return 密文</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @throws Exception</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">String</span> <span class="cm-variable">encrypt</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">dataStr</span>, <span class="cm-variable-3">String</span> <span class="cm-variable">publicKeyStr</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">System</span>.<span class="cm-variable">out</span>.<span class="cm-variable">println</span>(<span class="cm-string">"公钥分段加密开始"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">ByteArrayOutputStream</span> <span class="cm-variable">out</span> <span class="cm-operator">=</span> <span class="cm-atom">null</span>;</span></pre><pre class=" C
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">/**</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* Method: encrypt </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* description: 私钥分段解密 </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* </span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param content</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 解密内容,密文</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @param privateKeyStr</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 私钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @return 明文</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">* @throws Exception</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">String</span> <span class="cm-variable">decrypt</span>(<span class="cm-variable-3">String</span> <span class="cm-variable">dataStr</span>, <span class="cm-variable-3">String</span> <span class="cm-variable">PrivateKey</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">System</span>.<span class="cm-variable">out</span>.<span class="cm-variable">println</span>(<span class="cm-string">"私钥分段解密处理开始"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">ByteArrayOutputStream</span> <span class="cm-variable">out</span> <span class="cm-operator">=</span> <span class="cm-atom">null</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">String</span> <span class="cm-variable">decodedDataStr</span> <span class="cm-operator">=</span> <span class="cm-atom">null</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">try</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">out</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">ByteArrayOutputStream</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">byte</span>[] <span class="cm-variable">encryptedData</span> <span class="cm-operator">=</span> <span class="cm-variable">decryptBASE64</span>(<span class="cm-variable">dataStr</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 获取原始私钥</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">KeyFactory</span> <span class="cm-variable">keyFactory</span> <span class="cm-operator">=</span> <span class="cm-variable">KeyFactory</span>.<span class="cm-variable">getInstance</span>(<span class="cm-variable">KEY_ALGORITHM</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">Key</span> <span class="cm-variable">decodePrivateKey</span> <span class="cm-operator">=</span> <span class="cm-variable">getPrivateKeyFromBase64KeyEncodeStr</span>(<span class="cm-variable">PrivateKey</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">Cipher</span> <span class="cm-variable">cipher</span> <span class="cm-operator">=</span> <span class="cm-variable">Cipher</span>.<span class="cm-variable">getInstance</span>(<span class="cm-variable">keyFactory</span>.<span class="cm-variable">getAlgorithm</span>());</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">cipher</span>.<span class="cm-variable">init</span>(<span class="cm-variable">Cipher</span>.<span class="cm-variable">DECRYPT_MODE</span>, <span class="cm-variable">decodePrivateKey</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">int</span> <span class="cm-variable">inputLen</span> <span class="cm-operator">=</span> <span class="cm-variable">encryptedData</span>.<span class="cm-variable">length</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">int</span> <span class="cm-variable">offSet</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">byte</span>[] <span class="cm-variable">cache</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable-3">int</span> <span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-comment">// 对数据分段解密</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">while</span> (<span class="cm-variable">inputLen</span> <span class="cm-operator">-</span> <span class="cm-variable">offSet</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">if</span> (<span class="cm-variable">inputLen</span> <span class="cm-operator">-</span> <span class="cm-variable">offSet</span> <span class="cm-operator">&gt;</span> <span class="cm-variable">MAX_DECRYPT_BLOCK</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">cache</span> <span class="cm-operator">=</span> <span class="cm-variable">cipher</span>.<span class="cm-variable">doFinal</span>(<span class="cm-variable">encryptedData</span>, <span class="cm-variable">offSet</span>, <span class="cm-variable">MAX_DECRYPT_BLOCK</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span>} <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padd
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 4480px;"></div><div class="CodeMirror-gutters" style="display: none; height: 4480px;"></div></div></div></pre></div></div>
<script>(function(){var e=document.body.parentElement,t=[],n=null,i=document.body.classList.contains("typora-export-collapse-outline"),r=function(e,t,n){document.addEventListener(e,function(e){if(!e.defaultPrevented)for(var i=e.target;i&&i!=this;i=i.parentNode)if(i.matches(t)){!1===n.call(i,e)&&(e.preventDefault(),e.stopPropagation());break}},!1)};function o(){return e.scrollTop}r("click",".outline-expander",function(e){var t=this.closest(".outline-item-wrapper").classList;return t.contains("outline-item-open")?t.remove("outline-item-open"):t.add("outline-item-open"),d(),!1}),r("click",".outline-item",function(e){var t=this.querySelector(".outline-label");if(location.hash="#"+t.getAttribute("href"),i){var n=this.closest(".outline-item-wrapper").classList;n.contains("outline-item-open")||n.add("outline-item-open"),c(),n.add("outline-item-active")}});var a,s,l=function(){var e=o();n=null;for(var i=0;i<t.length&&t[i][1]-e<60;i++)n=t[i]},c=function(){document.querySelectorAll(".outline-item-active").forEach(e=>e.classList.remove("outline-item-active")),document.querySelectorAll(".outline-item-single.outline-item-open").forEach(e=>e.classList.remove("outline-item-open"))},d=function(){if(n){c();var e=document.querySelector('.outline-label[href="#'+(CSS.escape?CSS.escape(n[0]):n[0])+'"]');if(e)if(i){var t=e.closest(".outline-item-open>ul>.outline-item-wrapper");if(t)t.classList.add("outline-item-active");else{for(var r=(e=e.closest(".outline-item-wrapper")).parentElement.closest(".outline-item-wrapper");r;)r=(e=r).parentElement.closest(".outline-item-wrapper");e.classList.add("outline-item-active")}}else e.closest(".outline-item-wrapper").classList.add("outline-item-active")}};window.addEventListener("scroll",function(e){a&&clearTimeout(a),a=setTimeout(function(){l(),d()},300)});var u=function(){s=setTimeout(function(){!function(){t=[];var e=o();document.querySelector("#write").querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(n=>{var i=n.getAttribute("id");t.push([i,e+n.getBoundingClientRect().y])})}(),l(),d()},300)};window.addEventListener("resize",function(e){s&&clearTimeout(s),u()}),u()})();</script></body>
</html>