mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 12:57:32 +08:00
760 lines
323 KiB
HTML
760 lines
323 KiB
HTML
<!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-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#4-商户下单支付参数文档">4. 商户下单支付参数文档</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="#41--商户-银行接口参数定义">4.1 商户->银行接口参数定义</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="#42--md5摘要签名mac校验)">4.2 MD5摘要签名(MAC校验)</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="#43--中文信息需要escape编码">4.3 中文信息需要escape编码</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="#44--商户公钥密文">4.4 商户公钥密文</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="#45-外部平台商户号说明">4.5 外部平台商户号说明</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="#46-扩展域说明">4.6 扩展域说明</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="#47-paybitmap和accountbitmap说明">4.7 PAYBITMAP和ACCOUNTBITMAP说明</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="#48-orderid和userorderid说明">4.8 ORDERID和USER_ORDERID说明</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="#49--最终参数串示例">4.9 最终参数串示例</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="#5--基本交易流程说明">5. 基本交易流程说明</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="#51-业务流程图">5.1 业务流程图</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="#6-建行生活输入通讯报文接口规范">6. 建行生活输入通讯报文接口规范</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="#61-发送交易报文协议">6.1 发送交易报文协议</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-服务方后台与建行生活后台交易报文协议">(1) 服务方后台与建行生活后台交易报文协议</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-服务方前端与建行生活后台交易报文协议">(2) 服务方前端与建行生活后台交易报文协议</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="#62-报文规范">6.2 报文规范</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="#621-交易请求报文格式">6.2.1 交易请求报文格式</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="#请求报文头字段说明">请求报文头字段说明:</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="#请求报文样例">请求报文样例:</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="#622-交易应答报文规范">6.2.2 交易应答报文规范</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="#应答报文头字段说明">应答报文头字段说明:</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="#应答报文样例">应答报文样例:</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="#623-报文编码说明">6.2.3 报文编码说明</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="#624-报文长度说明">6.2.4 报文长度说明</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="#625-报文结构及数据类型">6.2.5 报文结构及数据类型</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="#报文结构">报文结构</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="#626-数据类型">6.2.6 数据类型</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="#63-服务接口定义">6.3 服务接口定义</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="#64-报文加密及签名">6.4 报文加密及签名</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="#641-流程说明">6.4.1 流程说明</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="#642-报文样例">6.4.2 报文样例</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="#643-交易说明">6.4.3 交易说明</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="#644-加解密及签名方法">6.4.4 加解密及签名方法</a></div><ul class="outline-children"></ul></li></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="#7-建行生活支付通知接口">7. 建行生活支付通知接口</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="#71-背景描述">7.1 背景描述</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="#72-字段描述">7.2 字段描述</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="#721-usrinfo字段说明">7.2.1 USRINFO字段说明</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="#722-usrmsg字段说明">7.2.2 USRMSG字段说明</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="#723-sign字段说明">7.2.3 SIGN字段说明</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="#724-ccbdiscountamt和ccbdiscountamtdesc字段说明">7.2.4 CCB_DISCOUNT_AMT和CCB_DISCOUNT_AMT_DESC字段说明</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="#725-mrchid字段说明">7.2.5 MRCH_ID字段说明</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="#725-crcrdinstmprdnum和bigamtinstmhdcg字段说明">7.2.5 CRCRD_INSTM_PRD_NUM和BIGAMT_INSTM_HDCG字段说明</a></div><ul class="outline-children"></ul></li></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="#8-建行生活退款操作通知接口不能用于退款结果判断">8. 建行生活退款操作通知接口(不能用于退款结果判断)</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="#81-背景描述">8.1 背景描述</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="#82-字段描述">8.2 字段描述</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="#821-sign字段说明">8.2.1 SIGN字段说明</a></div><ul class="outline-children"></ul></li></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="#9-附录">9. 附录</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="#91-响应字典">9.1 响应字典</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="#92-交易流水标识">9.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="#93-拓展域列表">9.3 拓展域列表</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="#94-文件参考">9.4 文件参考</a></div><ul class="outline-children"></ul></li></ul></li></div></div><div id='write' class=''><h1 id='建行相关app服务方接入文档v22020250725'><span>建行相关App服务方接入文档v2.20_20250725</span></h1><br><br><br><p><strong><font size=5><span>文档修订记录</span></font></strong></p><figure><table><thead><tr><th><span>版本</span></th><th><span>日期</span></th><th><span>修订说明</span></th></tr></thead><tbody><tr><td><span>2.1</span></td><td><span>2020.07.02</span></td><td><span>增加POSID19字段,需要使用微信支付的语音播报功能则该字段必传</span></td></tr><tr><td><span>2.2</span></td><td><span>2021.03.10</span></td><td><span>1.由商户公钥参与MD5改为由服务方公钥参与MD5;</span><br><span>2.商户公钥更改为由服务方公钥加密后传送。</span></td></tr><tr><td><span>2.3</span></td><td><span>2021.05.06</span></td><td><span>修改参数字段描述</span></td></tr><tr><td><span>2.4</span></td><td><span>2021.07.03</span></td><td><span>增加支付位图字段,POSID19不再为必传字段</span></td></tr><tr><td><span>2.5</span></td><td><span>2021.09.03</span></td><td><span>增加分期期数字段,支付通知相应返回额外分期字段</span></td></tr><tr><td><span>2.6</span></td><td><span>2021.10.18</span></td><td><span>增加外部平台商户号字段及相关说明</span></td></tr><tr><td><span>2.7</span></td><td><span>2022.03.16</span></td><td><span>增加中国建设银行App环境下支付对接token等字段</span></td></tr><tr><td><span>2.8</span></td><td><span>2022.07.28</span></td><td><span>调整文档结构</span></td></tr><tr><td><span>2.9</span></td><td><span>2022.08.04</span></td><td><span>商户下单支付参数增加支付参数;支付通知接口字段描述增加</span><code>DISCOUNT</code><span>、</span><code>ISECNY</code><span>、</span><code>ZHJF</code><span>字段</span></td></tr><tr><td><span>2.10</span></td><td><span>2022.10.27</span></td><td><span>商户下单支付参数增加支付通知NOTIFY_URL字段;支付通知接口</span><code>DISCOUNT</code><span>、</span><code>ISECNY</code><span>、</span><code>ZHJF</code><span>字段顺序调整</span></td></tr><tr><td><span>2.11</span></td><td><span>2023.04.20</span></td><td><span>商户下单支付参数增加数字人民币相关字段</span></td></tr><tr><td><span>2.12</span></td><td><span>2023.06.28</span></td><td><span>ccbParamSJ解密后明文新增GPS_TYPE坐标系类型</span></td></tr><tr><td><span>2.13</span></td><td><span>2023.10.17</span></td><td><span>ccbParamSJ新增编码说明</span></td></tr><tr><td><span>2.14</span></td><td><span>2023.12.20</span></td><td><span>商户下单支付接口增加支付方式\账户位图字段及说明</span></td></tr><tr><td><span>2.15</span></td><td><span>2024.01.29</span></td><td><span>支付通知接口新增字段</span></td></tr><tr><td><span>2.16</span></td><td><span>2024.01.29</span></td><td><span>商户下单支付参数增加用户订单号USER_ORDERID</span></td></tr><tr><td><span>2.17</span></td><td><span>2024.06.24</span></td><td><span>商户下单支付参数增加服务方二级商户信息相关字段:SUB_MCT_ID、SUB_MCT_NAME、SUB_MCT_MCC</span></td></tr><tr><td><span>2.18</span></td><td><span>2024.10.28</span></td><td><span>商户下单支付参数增加最小积分抵扣限制字段:MINPOINTLIMIT</span></td></tr><tr><td><span>2.19</span></td><td><span>2024.12.11</span></td><td><span>支付通知接口备注修改</span></td></tr><tr><td><span>2.20</span></td><td><span>2025.07.25</span></td><td><span>新增建行生活退款操作通知接口</span></td></tr></tbody></table></figure><br><br><br><br><br><br><br><br><p><strong><font size=5><span>文档目录</span></font></strong></p><div class='md-toc' mdtype='toc'><p class="md-toc-content" role="list"><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n3"><a class="md-toc-inner" href="#建行相关app服务方接入文档v22020250725">建行相关App服务方接入文档v2.20_20250725</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n95"><a class="md-toc-inner" href="#1-接入说明">1. 接入说明</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n98"><a class="md-toc-inner" href="#2-服务方跳转说明">2. 服务方跳转说明</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n99"><a class="md-toc-inner" href="#21-跳转url">2.1 跳转URL</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n186"><a class="md-toc-inner" href="#22-建行相关app环境识别">2.2 建行相关App环境识别</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n189"><a class="md-toc-inner" href="#221-建行生活app环境判断">2.2.1 建行生活App环境判断 </a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n202"><a class="md-toc-inner" href="#222-中国建设银行app环境判断">2.2.2 中国建设银行App环境判断</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n207"><a class="md-toc-inner" href="#23-加密串验证">2.3 加密串验证</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n218"><a class="md-toc-inner" href="#3--建行相关app支付接入文档">3. 建行相关App支付接入文档</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n221"><a class="md-toc-inner" href="#31-服务方调用收银台方法">3.1 服务方调用收银台方法</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n223"><a class="md-toc-inner" href="#311-在建行生活app环境收银台调用">3.1.1 在建行生活App环境收银台调用</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n225"><a class="md-toc-inner" href="#1-iphone系统调用">(1) iPhone系统调用</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n227"><a class="md-toc-inner" href="#2-android系统调用">(2) Android系统调用</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n229"><a class="md-toc-inner" href="#312-在中国建设银行app环境收银台调用">3.1.2 在中国建设银行App环境收银台调用</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n234"><a class="md-toc-inner" href="#32-支付成功页面回调设置">3.2 支付成功页面回调设置</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n277"><a class="md-toc-inner" href="#33-其他说明">3.3 其他说明</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n286"><a class="md-toc-inner" href="#4-商户下单支付参数文档">4. 商户下单支付参数文档</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n289"><a class="md-toc-inner" href="#41--商户-银行接口参数定义">4.1 商户->银行接口参数定义</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n642"><a class="md-toc-inner" href="#42--md5摘要签名mac校验)">4.2 MD5摘要签名(MAC校验)</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n648"><a class="md-toc-inner" href="#43--中文信息需要escape编码">4.3 中文信息需要escape编码</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n651"><a class="md-toc-inner" href="#44--商户公钥密文">4.4 商户公钥密文</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n655"><a class="md-toc-inner" href="#45-外部平台商户号说明">4.5 外部平台商户号说明</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n657"><a class="md-toc-inner" href="#46-扩展域说明">4.6 扩展域说明</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n661"><a class="md-toc-inner" href="#47-paybitmap和accountbitmap说明">4.7 PAYBITMAP和ACCOUNTBITMAP说明</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n665"><a class="md-toc-inner" href="#48-orderid和userorderid说明">4.8 ORDERID和USER_ORDERID说明</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n673"><a class="md-toc-inner" href="#49--最终参数串示例">4.9 最终参数串示例</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n679"><a class="md-toc-inner" href="#5--基本交易流程说明">5. 基本交易流程说明</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n680"><a class="md-toc-inner" href="#51-业务流程图">5.1 业务流程图</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n689"><a class="md-toc-inner" href="#6-建行生活输入通讯报文接口规范">6. 建行生活输入通讯报文接口规范</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n690"><a class="md-toc-inner" href="#61-发送交易报文协议">6.1 发送交易报文协议</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n691"><a class="md-toc-inner" href="#1-服务方后台与建行生活后台交易报文协议">(1) 服务方后台与建行生活后台交易报文协议</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n708"><a class="md-toc-inner" href="#2-服务方前端与建行生活后台交易报文协议">(2) 服务方前端与建行生活后台交易报文协议</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n732"><a class="md-toc-inner" href="#62-报文规范">6.2 报文规范</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n733"><a class="md-toc-inner" href="#621-交易请求报文格式">6.2.1 交易请求报文格式</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n735"><a class="md-toc-inner" href="#请求报文头字段说明">请求报文头字段说明:</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n774"><a class="md-toc-inner" href="#请求报文样例">请求报文样例:</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n776"><a class="md-toc-inner" href="#622-交易应答报文规范">6.2.2 交易应答报文规范</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n778"><a class="md-toc-inner" href="#应答报文头字段说明">应答报文头字段说明:</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n831"><a class="md-toc-inner" href="#应答报文样例">应答报文样例:</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n833"><a class="md-toc-inner" href="#623-报文编码说明">6.2.3 报文编码说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n835"><a class="md-toc-inner" href="#624-报文长度说明">6.2.4 报文长度说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n837"><a class="md-toc-inner" href="#625-报文结构及数据类型">6.2.5 报文结构及数据类型</a></span><span role="listitem" class="md-toc-item md-toc-h5" data-ref="n839"><a class="md-toc-inner" href="#报文结构">报文结构</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n852"><a class="md-toc-inner" href="#626-数据类型">6.2.6 数据类型</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n855"><a class="md-toc-inner" href="#63-服务接口定义">6.3 服务接口定义</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n858"><a class="md-toc-inner" href="#64-报文加密及签名">6.4 报文加密及签名</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n860"><a class="md-toc-inner" href="#641-流程说明">6.4.1 流程说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n873"><a class="md-toc-inner" href="#642-报文样例">6.4.2 报文样例</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n878"><a class="md-toc-inner" href="#643-交易说明">6.4.3 交易说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n888"><a class="md-toc-inner" href="#644-加解密及签名方法">6.4.4 加解密及签名方法</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n905"><a class="md-toc-inner" href="#7-建行生活支付通知接口">7. 建行生活支付通知接口</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n914"><a class="md-toc-inner" href="#71-背景描述">7.1 背景描述</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n936"><a class="md-toc-inner" href="#72-字段描述">7.2 字段描述</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1104"><a class="md-toc-inner" href="#721-usrinfo字段说明">7.2.1 USRINFO字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1141"><a class="md-toc-inner" href="#722-usrmsg字段说明">7.2.2 USRMSG字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1244"><a class="md-toc-inner" href="#723-sign字段说明">7.2.3 SIGN字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1279"><a class="md-toc-inner" href="#724-ccbdiscountamt和ccbdiscountamtdesc字段说明">7.2.4 CCB_DISCOUNT_AMT和CCB_DISCOUNT_AMT_DESC字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1281"><a class="md-toc-inner" href="#725-mrchid字段说明">7.2.5 MRCH_ID字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1283"><a class="md-toc-inner" href="#725-crcrdinstmprdnum和bigamtinstmhdcg字段说明">7.2.5 CRCRD_INSTM_PRD_NUM和BIGAMT_INSTM_HDCG字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n1286"><a class="md-toc-inner" href="#8-建行生活退款操作通知接口不能用于退款结果判断">8. 建行生活退款操作通知接口(不能用于退款结果判断)</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n1293"><a class="md-toc-inner" href="#81-背景描述">8.1 背景描述</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n1295"><a class="md-toc-inner" href="#82-字段描述">8.2 字段描述</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n1328"><a class="md-toc-inner" href="#821-sign字段说明">8.2.1 SIGN字段说明</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n1350"><a class="md-toc-inner" href="#9-附录">9. 附录</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n1351"><a class="md-toc-inner" href="#91-响应字典">9.1 响应字典</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n1362"><a class="md-toc-inner" href="#92-交易流水标识">9.2 交易流水标识</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n1373"><a class="md-toc-inner" href="#93-拓展域列表">9.3 拓展域列表</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n1378"><a class="md-toc-inner" href="#94-文件参考">9.4 文件参考</a></span></p></div><br><br><br><br><h1 id='1-接入说明'><span>1. 接入说明</span></h1><p><span>本文为服务方在建行相关App上接入H5生活场景的技术规范。</span></p><p><span>由于完成接入后的第三方生活场景将</span><strong><span>同时上架于多个建行相关App</span></strong><span>,服务方在对接技术规范时务必着重关注有关具体建行App的适配要求,</span><strong><span>逐一适配文档所列App</span></strong><span>。</span></p><h1 id='2-服务方跳转说明'><span>2. 服务方跳转说明</span></h1><h3 id='21-跳转url'><span>2.1 跳转URL</span></h3><p><span>建行相关App通过分类入口跳转或订单详情跳转至服务方链接时,使用URL格式为:</span></p><blockquote><p><span>url?platform=ccblife&channel=mbs&ccbParamSJ=xxxxxx&CITYID=330100&USERCITYID =440100</span></p></blockquote><p><span>其中:</span></p><p><strong><span>url</span></strong><span>为服务方页面链接地址(一般为中间页面,用于对跳转参数的解密验签处理及二次跳转);</span></p><p><strong><span>platform=ccblife</span></strong><span>为建行生活平台标识符</span></p><p><strong><span>channel</span></strong><span>为当前运行环境所在的App,如</span><code>channel=mbs</code><span>表示在中国建设银行App运行,如无此参数则默认为在建行生活App运行。</span></p><p><strong><span>CITYID、USERCITYID</span></strong><span>为用户选择与定位城市代码,参考6位的中国城市代码,同密文参数一致</span></p><p><strong><span>ccbParamSJ</span></strong><span>为使用服务方公钥RSA加密后再base64+encodeURIComponent的加密密文,其解密后明文为携带的用户信息,其格式为: </span><strong><span>USERID=&MOBILE=...</span></strong><span> (先进行URLDecode之后,再进行解密,解密方法同样参考</span><a href='#chapter6_4'><span>《报文加密及签名》</span></a><span>,略去签名步骤)</span></p><p><span>密文携带的基本参数如下:</span></p><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>BGCOLOR</span></td><td><span>String</span></td><td><span>背景色</span></td><td><span>默认为空</span></td></tr><tr><td><span>PLATFLOWNO</span></td><td><span>String</span></td><td><span>登录校验流水号</span></td><td> </td></tr><tr><td><span>TIMESTAMP</span></td><td><span>String</span></td><td><span>跳转服务方时间戳</span></td><td><span>13位毫秒级</span></td></tr><tr><td><span>USERID</span></td><td><span>String</span></td><td><span>建行生活用户ID</span></td><td> </td></tr><tr><td><span>MOBILE</span></td><td><span>String</span></td><td><span>手机号码</span></td><td> </td></tr><tr><td><span>CITYID</span></td><td><span>String</span></td><td><span>用户选择城市代码</span></td><td><span>使用标准的中国城市代码</span></td></tr><tr><td><span>USERCITYID</span></td><td><span>String</span></td><td><span>用户定位城市代码</span></td><td> </td></tr><tr><td><span>LGT</span></td><td><span>String</span></td><td><span>经度</span></td><td> </td></tr><tr><td><span>LTT</span></td><td><span>String</span></td><td><span>纬度</span></td><td> </td></tr><tr><td><span>GPS_TYPE</span></td><td><span>String</span></td><td><span>GPS坐标系</span></td><td><span>可能值为:gcj02(高德地图坐标)、bd09(百度地图坐标)</span></td></tr><tr><td><span>APPID</span></td><td><span>String</span></td><td><span>小程序appid</span></td><td><span>小程序专用参数,APP不存在</span></td></tr><tr><td><span>OPENID</span></td><td><span>String</span></td><td><span>用户在小程序下唯一标识</span></td><td><span>小程序专用参数,APP不存在</span></td></tr><tr><td><span>ORDERID</span></td><td><span>String</span></td><td><span>订单号</span></td><td><span>通过订单详情跳转会携带此字段</span></td></tr><tr><td><span>TOKEN</span></td><td><span>String</span></td><td><span>建行生活用户TOKEN</span></td><td><span>仅通过</span><strong><span>手机银行</span></strong><span>访问建行生活场景时携带</span></td></tr></tbody></table></figure><h3 id='22-建行相关app环境识别'><span>2.2 建行相关App环境识别</span></h3><p><span>服务方生活场景,按本章节方法识别当前运行的App环境是否为建行相关App。本章节所列App环境必须全部适配。</span></p><h4 id='221-建行生活app环境判断'><span>2.2.1 建行生活App环境判断 </span></h4><p><span>按如下顺序判断当前页面是否由建行生活App平台打开,</span><strong><span>满足其中任一条件即表示当前页面由建行生活App平台打开</span></strong><span>:</span></p><p><strong><span>1)跳转url中包含</span><code>platform=ccblife</code><span>参数;</span></strong></p><p><span>例:</span></p><blockquote><p><span>url?platform=ccblife&channel=mbs&ccbParamSJ=xxxxxx&CITYID=330100&USERCITYID =440100</span></p></blockquote><p><strong><span>2)H5页面通过判断</span><code>navigator.userAgent</code><span>中含有</span><code>CloudMercWebView</code><span>字段</span></strong>
|
||
<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"></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-variable">getUACallBackFund</span>(<span class="cm-string">"{</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">data</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ua</span>:<span class="cm-string">'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/CloudMercWebView'</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 class="cm-variable">state</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-variable">msg</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-string">")</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><h4 id='222-中国建设银行app环境判断'><span>2.2.2 中国建设银行App环境判断</span></h4><p><span>当前跳转url中同时包含</span><code>platform=ccblife</code><span>以及</span><code>channel=mbs</code><span>两个参数,即表示当前在中国建设银行App环境。</span></p><p><span>例:</span></p><blockquote><p><span>url?platform=ccblife&channel=mbs&ccbParamSJ=xxxxxx&CITYID=330100&USERCITYID =440100</span></p></blockquote><h3 id='23-加密串验证'><span>2.3 加密串验证</span></h3><p><span>为防止加密串被非法窃取导致的越权风险,建议服务方对加密串进行唯一请求校验。</span>
|
||
<span>例如以下请求串被抓包截取后,不校验即可能越权访问客户信息:</span></p><blockquote><p><a href='https://ccb.wenyu6.com/api/ccb/user?platform=ccblife&channel=mbs&ccbParamSJ=SnU1d0F6bkNCSUZhUFAvL0xpK3FVNml3OHptcDViTnFIR3RlQjlhWldUUlNJbWNXbytpR0VFNHdIeWFuWTdWdFl1VVFQaFBrV3R6WQptY3JldURGOGVyNmFiQ3N0TFgyYU1QeGsrZmxWUFJ3VEZGWmR4d084V0NCYlJyWGNnVXptMUQ1amVoT3hEZ0U1amM4OHF1MXdqd0I2ClVMV0t3bENmOEw1aGtEZUJsMk5Db04wQWxHVXBuRkMzRk9vWENHSUdNSHNNVVRmK2ZHUEFzTmFsR25SWkZiTmt1M0I0YkM2YkxCOTUKdWV3RG9ESVpTU2hHbUJOMFZ6U3Z5SFIzUWx0Umg5T3hQeU03UmFzTTRVQWllZTRBandRL1YyNURXeGZrOWdDRWRRWEx4d2pkOWUTVqTFg2dU8rRldJNzJEQmp2UT09Cg%3D%3D&CITYID=330100&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></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-operator"><</span><span class="cm-variable">script</span> <span class="cm-variable">language</span><span class="cm-operator">=</span><span class="cm-string">"JavaScript"</span><span class="cm-operator">></span></span></pre></div><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"> * @param {String} payInfo payInfo为支付参数(支付参数详见4.商户下单支付参数文档)</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-keyword">function</span> <span class="cm-def">MBS_DIRECT_PAY</span>(<span class="cm-def">payInfo</span>){</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">window</span>.<span class="cm-property">location</span><span class="cm-operator">=</span><span class="cm-string">"mbspay://direct?"</span><span class="cm-operator">+</span> <span class="cm-variable-2">payInfo</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 class="cm-operator"><</span><span class="cm-string-2">/script></span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 202px;"></div><div class="CodeMirror-gutters" style="display: none; height: 202px;"></div></div></div></pre><h5 id='2-android系统调用'><span>(2) Android系统调用</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></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-operator"><</span><span class="cm-variable">script</span> <span class="cm-variable">language</span><span class="cm-operator">=</span><span class="cm-string">"JavaScript"</span><span class="cm-operator">></span></span></pre></div><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"> * @param {String} payInfo payInfo为支付参数(支付参数详见4.商户下单支付参数文档)</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-keyword">function</span> <span class="cm-def">MBS_DIRECT_PAY</span>(<span class="cm-def">payInfo</span>){</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">window</span>.<span class="cm-property">mbspay</span>.<span class="cm-property">directpay</span>(<span class="cm-variable-2">payInfo</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 class="cm-operator"><</span><span class="cm-string-2">/script></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: 224px;"></div><div class="CodeMirror-gutters" style="display: none; height: 224px;"></div></div></div></pre><h4 id='312-在中国建设银行app环境收银台调用'><span>3.1.2 在中国建设银行App环境收银台调用</span></h4><p><span>将支付参数组装后(含建行生活用户token,详见支付SDK</span><a href='#chapter4'><span>《商户下单支付参数》</span></a><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><span>进行RSA加密,将密文、签名、服务方编号作为get请求参数,以html跳转的方式访问建行生活收银处理URL,由建行生活服务端统一处理并以302重定向方式返回建行生活收银台页面。</span></p><p><span>其中:</span></p><p><span>建行生活收银处理URL 通讯报文协议见</span><a href='#chapter6'><span>《6.1 发送交易报文协议》</span></a><span>“(2) 服务方前端与建行生活后台交易报文协议”。</span></p><h3 id='32-支付成功页面回调设置'><span>3.2 支付成功页面回调设置</span></h3><p><strong><span>支付完成后默认跳转到建行生活的支付成功页面,如服务方需要跳转到自己的成功页,请调用setCache方法来设置。(setCache操作须在调起收银台(</span><a href='#chapter3_1_1'><span>3.1.1 在建行生活App环境收银台调用</span></a><span>)前进行)</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"><span><span></span>x</span></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-keyword">var</span> <span class="cm-def">requestObj</span> <span class="cm-operator">=</span> {</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-property">action</span>:<span class="cm-string">'setCache'</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-property">params</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-property">key</span>: <span class="cm-string">''</span>, <span class="cm-comment">// 回调的key,与下单参数的remark2保持一致,上送服务方编号</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-property">value</span>: <span class="cm-string">''</span> <span class="cm-comment">// 回调的url,支付成功后将由建行生活收银台跳转至此url</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></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 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 class="cm-variable">requestObj</span>), <span class="cm-string">'callBackName'</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">// 注: 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> </td></tr><tr><td><span>POSID</span></td><td><span>柜台号</span></td><td> </td></tr><tr><td><span>ORDERID</span></td><td><span>订单号</span></td><td> </td></tr><tr><td><span>PAYMENT</span></td><td><span>订单金额</span></td><td> </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> </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> </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 商户->银行接口参数定义</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>仅作为参数传递,不参与MAC校验</span></font></td></tr><tr><td><span>PLATMCTID</span></td><td><span>外部平台商户号</span></td><td><span>CHAR(19)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>F</span></td><td><span>当使用外部商户号时,建行商户号、柜台号、分行号及终端号无需上送。</span><br><font color=red><span>当该字段有值时参与MAC校验,否则不参与MAC校验。</span></font></td></tr><tr><td><span>ORDERID</span></td><td><span>支付流水号</span></td><td><span>CHAR(30)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>由商户提供,最长30位,支付时上送到支付中台,支付结果查询和退款使用</span></td></tr><tr><td><span>USER_ORDERID</span></td><td><span>用户订单号</span></td><td><span>CHAR(30)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>由商户提供,最长30位,用户订单列表订单信息,订单推送和更新时订单号,支付校验订单信息</span></td></tr><tr><td><span>PAYMENT</span></td><td><span>付款金额</span></td><td><span>NUMBER(16,2)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>由商户提供,最长30位</span></td></tr><tr><td><span>CURCODE</span></td><td><span>币种</span></td><td><span>CHAR(2)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>缺省为01-人民币(只支持人民币支付)</span></td></tr><tr><td><span>TXCODE</span></td><td><span>交易码</span></td><td><span>CHAR(6)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>由建行统一分配为</span><font color=red><span>520100</span></font></td></tr><tr><td><span>REMARK1</span></td><td><span>备注1</span></td><td><span>CHAR(30)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>T</span></td><td><span>网银不处理,直接传到城综网,该字段只支持送数字和英文</span></td></tr><tr><td><span>REMARK2</span></td><td><span>备注2</span></td><td><span>CHAR(30)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><font color=red><span>上送YS开头的服务方编号,与PLATFORMID保持一致</span></font></td></tr><tr><td><span>TYPE</span></td><td><span>接口类型</span></td><td><span>CHAR(1)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>默认送1 - 防钓鱼接口</span></td></tr><tr><td><span>GATEWAY</span></td><td><span>网关类型</span></td><td><span>CHAR(100)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>默认送0</span></td></tr><tr><td><span>CLIENTIP</span></td><td><span>客户端IP</span></td><td><span>CHAR(40)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>T</span></td><td><span>送空值即可</span></td></tr><tr><td><span>REGINFO</span></td><td><span>客户注册信息</span></td><td><span>CHAR(256)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>T</span></td><td><span>客户在商户系统中注册的信息,中文需使用escape编码。送空值即可</span></td></tr><tr><td><span>PROINFO</span></td><td><span>商品信息</span></td><td><span>CHAR(256)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>T</span></td><td><span>客户购买的商品信息,收银台会展示该信息,中文需使用escape编码。建议编码前长度不超过50位</span></td></tr><tr><td><span>REFERER</span></td><td><span>商户URL</span></td><td><span>CHAR(100)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>T</span></td><td><span>商户送空值即可</span></td></tr><tr><td><span>INSTALLNUM</span></td><td><span>分期期数</span></td><td><span>CHAR(2)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>信用卡支付分期期数,一般为 3、6、12 等,必须为大于 1 的整数。</span><br><font color=red><span>仅当分期支付时上送该字段,无此字段上送时,则视为普通支付。</span></font></td></tr><tr><td><span>THIRDAPPINFO</span></td><td><span>客户端标识</span></td><td><span>CHAR(40)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>通过建行相关App下单场景,订单中客户端标识固定设为</span><font color=red><span>comccbpay1234567890cloudmerchant</span></font></td></tr><tr><td><span>TIMEOUT</span></td><td><span>订单超时时间</span></td><td><span>CHAR(14)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>格式:YYYYMMDDHHMMSS(如:20120214143005)</span><br><span>银行系统时间> TIMEOUT时拒绝交易,若送空值则不判断超时。</span><br><font color=red><span>当该字段有值时参与MAC校验,否则不参与MAC校验。</span></font></td></tr><tr><td><font color=#5d9df7><span>USERID</span></font></td><td><span>建行生活用户ID</span></td><td><span>CHAR(32)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>仅在中国建设银行App环境使用。 </span><br><font color=red><span>当该字段有值时参与MAC校验,否则不参与MAC校验。</span></font></td></tr><tr><td><font color=#5d9df7><span>TOKEN</span></font></td><td><span>建行生活用户TOKEN</span></td><td><span>CHAR(32)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>仅在中国建设银行App环境使用。</span><br><font color=red><span>当该字段有值时参与MAC校验,否则不参与MAC校验。</span></font></td></tr><tr><td><font color=#5d9df7><span>PAYSUCCESSURL</span></font></td><td><span>支付成功页面URL</span></td><td><span>CHAR(128)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>仅在中国建设银行App环境使用,如需指定支付成功页面时提供,需对URL编码,</span><strong><span>生产环境必须为HTTPS</span></strong><span>。未提供则默认跳转到建行生活的支付成功页面</span><br><font color=red><span>当该字段有值时参与MAC校验,否则不参与MAC校验。</span></font></td></tr><tr><td><font color=#999><span>PAYBITMAP</span></font></td><td><span>支付位图</span></td><td><span>CHAR(10)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。</span></td></tr><tr><td><font color=#999><span>ACCOUNTBITMAP</span></font></td><td><span>支付账户位图</span></td><td><span>CHAR(10)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。</span></td></tr><tr><td><font color=#999><span>POINTAVYID</span></font></td><td><span>积分二级活动编号</span></td><td><span>VARCHAR(6)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。龙支付积分二级活动上送 010051</span></td></tr><tr><td><font color=#999><span>DCEPDEPACCNO</span></font></td><td><span>数字人民币收款钱包编号</span></td><td><span>VARCHAR(32)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。数字人民币商户绑定的收款钱包编号</span></td></tr><tr><td><font color=#999><span>COUPONAVYID</span></font></td><td><span>有价券活动编号</span></td><td><span>VARCHAR(32)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。</span></td></tr><tr><td><font color=#999><span>ONLY_CREDIT_PAY_FLAG</span></font></td><td><span>限制信用卡支付标志</span></td><td><span>CHAR(1)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。当有价券活动编号不为空时生效,送Y限制仅信用卡能支付,送N或空不作限制</span></td></tr><tr><td><font color=#999><span>FIXEDPOINTVAL</span></font></td><td><span>固定抵扣积分值</span></td><td><span>VARCHAR(16)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。上送该值时,若用户不满足积分使用条件将拒绝支付</span></td></tr><tr><td><font color=#999><span>MINPOINTLIMIT</span></font></td><td><span>最小使用积分抵扣限制</span></td><td><span>VARCHAR(16)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。上送整数值时,视为最小积分抵扣数额;上送小于1的小数时,视为最小积分抵扣比例。若用户不满足积分使用条件将拒绝支付。</span></td></tr><tr><td><font color=#999><span>IDENTITYCODE</span></font></td><td><span>身份证后6位</span></td><td><span>VARCHAR(256)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。</span><strong><span>仅中石化服务方可用</span></strong><span>。身份证号后6位加密串,用于身份识别。加密说明:</span><br><span>用服务方公钥对身份证后6位进行RSA加密,再进行base64,再进行encodeURIComponent一次。</span></td></tr><tr><td><font color=#999><span>NOTIFY_URL</span></font></td><td><span>支付异步通知地址</span></td><td><span>VARCHAR(512)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。</span><strong><span>仅中石化服务方可用</span></strong><span>。支付结果异步通知地址的encodeURIComponent编码值,多个通知地址时,分隔符用英文半角符号 , 分隔。</span></td></tr><tr><td><font color=#999><span>DCEP_MCT_TYPE</span></font></td><td><span>数币商户类型</span></td><td><span>CHAR(1)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。0\空-不识别为数币商户;1-融合商户;2-非融合商户</span></td></tr><tr><td><font color=#999><span>DCEP_MERCHANTID</span></font></td><td><span>数字人民币商户号</span></td><td><span>CHAR(15)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。当DCEP_MCT_TYPE为2时上送值。</span></td></tr><tr><td><font color=#999><span>DCEP_POSID</span></font></td><td><span>数字人民币柜台号</span></td><td><span>CHAR(9)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。当DCEP_MCT_TYPE为2时上送值。</span></td></tr><tr><td><font color=#999><span>DCEP_BRANCHID</span></font></td><td><span>数字人民币分行号</span></td><td><span>CHAR(9)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。当DCEP_MCT_TYPE为2时上送值。</span></td></tr><tr><td><font color=#999><span>SUB_MCT_ID</span></font></td><td><span>服务方二级商户编号</span></td><td><span>VARCHAR(20)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,涉及银联反欺诈时使用。若支付发起方为平台类服务方,需上送第三方平台下实际发起支付的二级商户所对应的商户编号。</span></td></tr><tr><td><font color=#999><span>SUB_MCT_NAME</span></font></td><td><span>服务方二级商户名称</span></td><td><span>VARCHAR(40)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,涉及银联反欺诈时使用。若支付发起方为平台类服务方,需上送第三方平台下实际发起支付的二级商户所对应的商户名称。</span></td></tr><tr><td><font color=#999><span>SUB_MCT_MCC</span></font></td><td><span>服务方二级商户类别</span></td><td><span>CHAR(4)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,涉及银联反欺诈时使用。若支付发起方为平台类服务方,需上送第三方平台下实际发起支付的二级商户所对应的商户MCC码。</span></td></tr><tr><td><font color=#999><span>EXTENDPARAMS</span></font></td><td><span>扩展域</span></td><td><span>VARCHAR(256)</span></td><td style='text-align:center;' ><span>N</span></td><td style='text-align:center;' ><span>F</span></td><td><span>默认为空,特定场景使用。上送约定JSON格式字符串。</span></td></tr><tr><td><font color=red><span>PLATFORMPUB</span></font></td><td><span>服务方公钥</span></td><td><span>VARCHAR(256)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>F</span></td><td><font color=red><span>仅作为源串参加MD5摘要,不作为参数传递</span></font></td></tr><tr><td><span>MAC</span></td><td><span>MD5加密串</span></td><td><span>CHAR(32)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>采用标准MD5算法,对以上字段进行MAC加密(32位小写),由商户实现。</span></td></tr><tr><td><font color=red><span>PLATFORMID</span></font></td><td><span>服务方编号</span></td><td><span>CHAR(16)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>T</span></td><td><span>以YS开头的16位编号。</span><font color=red><span>仅作为参数传递,不参与MAC校验</span></font></td></tr><tr><td><font color=red><span>ENCPUB</span></font></td><td><span>商户公钥密文</span></td><td><span>VARCHAR(512)</span></td><td style='text-align:center;' ><span>Y</span></td><td style='text-align:center;' ><span>F</span></td><td><span>使用服务方公钥对商户公钥后30位进行RSA加密并base64后的密文。</span><br><span>若商户已经上架建行生活并同步公钥,或是使用外部商户号时,可以不再上送商户公钥。</span><font color=red><span>仅作为参数传递,不参与MAC校验</span></font></td></tr><tr><td><font color=#999><span>SCNID</span></font></td><td><span>场景编号</span></td><td><span>VARCHAR(32)</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>仅作为参数传递,不参与MAC校验</span></font></td></tr><tr><td><font color=#999><span>SCN_PLTFRM_ID</span></font></td><td><span>场景平台编号</span></td><td><span>VARCHAR(32)</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>仅作为参数传递,不参与MAC校验</span></font></td></tr></tbody></table></figure><p><span>注1:字符串中变量名必须是大写字母。</span><br/><span>注2:</span><code>是否非空</code><span>指该字段是否为非空字段。Y表示上送该字段时,值不可为空;N表示值可以为空。</span>
|
||
<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> </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&POSID=313368474&BRANCHID=441000000&ORDERID=202209020000000061&USER_ORDERID=202209020000000061&PAYMENT=22.39&CURCODE=01&TXCODE=520100&REMARK1=&REMARK2=YS44000098000600&TYPE=1&GATEWAY=0&CLIENTIP=&REGINFO=&PROINFO=&REFERER=&THIRDAPPINFO=comccbpay1234567890cloudmerchant&TIMEOUT=20220902103420</span><font color=#FF6600><span>&DCEP_MCT_TYPE=1</span></font><span>&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表示不可用。两个字段可单独使用,未上送时默认全部支付方式都支持,即全为1(1111111111)。</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&POSID=313368474&BRANCHID=441000000&ORDERID=202209020000000061&USER_ORDERID=202209020000000061&PAYMENT=22.39&CURCODE=01&TXCODE=520100&REMARK1=&REMARK2=YS44000098000600&TYPE=1&GATEWAY=0&CLIENTIP=&REGINFO=&PROINFO=&REFERER=&THIRDAPPINFO=comccbpay1234567890cloudmerchant&TIMEOUT=20220902103420</span><font color=#FF6600><span>&DCEP_MCT_TYPE=1</span></font><span>&MAC=f07ef63236e3bbbc1dc221b06e631f3d&PLATFORMID=YS44000098000600</span><font color=#FF6600><span>&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> </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&svcid=aaaaaaaaa&cnt=xxxxxx&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> </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> </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> </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> </td><td><span>CHAR(32)</span></td><td><span>Y</span></td><td><span>用于标识唯一性</span></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"><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;"> <span class="cm-string cm-property">"CLD_HEADER"</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_CHNL"</span>:<span class="cm-string">"YSTEST"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_TIME"</span>:<span class="cm-string">"20241231090000"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_CODE"</span>:<span class="cm-string">"A3341O031"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_SEQ"</span>:<span class="cm-string">"1010114131620897033814262"</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 class="cm-string cm-property">"CLD_BODY"</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></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> </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> </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> </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> </td><td><span>CHAR(32)</span></td><td><span>Y</span></td><td> </td></tr><tr><td><span>CLD_DESC</span></td><td><span>交易响应内容</span></td><td> </td><td><span>CHAR(32)</span></td><td><span>Y</span></td><td> </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;"></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-string cm-property">"CLD_HEADER"</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_CHNL"</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-string cm-property">"CLD_TX_TIME"</span>:<span class="cm-string">"20151231090000"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_CODE"</span>:<span class="cm-string">"A3341O031"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_SEQ"</span>:<span class="cm-string">"1010114131620897033914221"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_RESP"</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_CODE"</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-string cm-property">"CLD_DESC"</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></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_BODY"</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></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;"> <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;"> <span class="cm-string">"张杨路500号14楼"</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></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="G"代表是一个复合类型。</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;"> <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;"> <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;"> <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;"> <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;"> <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;"> }</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"><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-string cm-property">"SCI_LIST"</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 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;"> <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;"> <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;"> <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;"> },</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 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;"> <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;"> <span class="cm-string cm-property">"POSTCOD_TYP"</span>:<span class="cm-string">"200123"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"TEL_NO"</span>:<span class="cm-string">"13601735605"</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></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: 358px;"></div><div class="CodeMirror-gutters" style="display: none; height: 358px;"></div></div></div></pre><h4 id='626-数据类型'><span>6.2.6 数据类型</span></h4><p><span>数据类型分为</span><code>B</code><span>、</span><code>C</code><span>、</span><code>N</code><span>、</span><code>codestring</code><span>。</span><code>B</code><span>为字节数组、</span><code>C</code><span>为字符串,</span><code>N</code><span>为数值型(长度、小数位),</span><code>codestring</code><span>为分类代码。它们在XML中都是以字符串存储的,</span><code>B</code><span>类型用Base64编码后存储。</span><code>C</code><span>类型非法字符以</span><![CDATA[……]]><span>存储。</span></p><br><h3 id='63-服务接口定义'><span>6.3 服务接口定义</span></h3><p><span>详见接口定义文档《建行生活输入通讯报文》(.xlsx)(在附件中获取)</span></p><br><h3 id='64-报文加密及签名'><span>6.4 </span><span id="chapter6_4"><span>报文加密及签名</span></span></h3><p><img src="https://img-blog.csdnimg.cn/20210513172903339.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x4MTU0NDg1NA==,size_16,color_FFFFFF,t_70" referrerpolicy="no-referrer" alt="encrypt"></p><h4 id='641-流程说明'><span>6.4.1 流程说明</span></h4><ol start='' ><li><span>服务方与建行生活后端通讯是通过JSON密文进行,例子如下:</span></li></ol><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;"><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-string cm-property">"svcid"</span>: <span class="cm-string">"服务方ID,以YS开头"</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 cm-property">"cnt"</span>: <span class="cm-string">"密文xxxx"</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 cm-property">"mac"</span>: <span class="cm-string">"签名yyyy"</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><ol start='2' ><li><span>当前置解密失败或验签失败时,建行生活无法识别进来系统的信息,无法正常处理,则会直接返回JSON错误报文(当加密失败时,同样走此路径)</span></li></ol><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"><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-string cm-property">"code"</span>: <span class="cm-string">"错误码xxxx"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"msg"</span>: <span class="cm-string">"错误描述yyyy"</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: 90px;"></div><div class="CodeMirror-gutters" style="display: none; height: 90px;"></div></div></div></pre><ol start='3' ><li><span>当前置解密+验签成功时,说明可以确认对应的密钥信息,后续业务处理后,无论是否发生异常,都根据加密加签标准返回报文,如下</span></li></ol><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"><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-string cm-property">"cnt"</span>: <span class="cm-string">"密文xxxx"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"mac"</span>: <span class="cm-string">"签名yyyy"</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: 90px;"></div><div class="CodeMirror-gutters" style="display: none; height: 90px;"></div></div></div></pre><h4 id='642-报文样例'><span>6.4.2 报文样例</span></h4><p><span>原始报文:</span></p><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;"></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-string cm-property">"CLD_HEADER"</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_CHNL"</span>:<span class="cm-string">"YSTEST"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_TIME"</span>:<span class="cm-string">"20191112145911"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_CODE"</span>:<span class="cm-string">"A3341O031"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"CLD_TX_SEQ"</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 class="cm-string cm-property">"CLD_BODY"</span>:{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"USER_ID"</span>:<span class="cm-string">"user123"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"ORDER_ID"</span>:<span class="cm-string">"order123"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"ORDER_DT"</span>:<span class="cm-string">"20191112145811"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"TOTAL_AMT"</span>:<span class="cm-string">"100.00"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"PAY_AMT"</span>:<span class="cm-string">"90.00"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"DISCOUNT_AMT"</span>:<span class="cm-string">"10.00"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"ORDER_STATUS"</span>:<span class="cm-string">"1"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"REFUND_STATUS"</span>:<span class="cm-string">"0"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"MCT_NM"</span>:<span class="cm-string">"XXX商户"</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></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 426px;"></div><div class="CodeMirror-gutters" style="display: none; height: 426px;"></div></div></div></pre><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.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-string cm-property">"cnt"</span>:<span class="cm-string">"UWl3VVVIT0IzSHp6VUtpNFVmb25VcWJjMnBKdU9IclJUZ3lISGJLR3Myd21saWQvMTVvenNMNk5xWmFwUzl1clh5K2VkVmJuU1BYMg0KTzUwamNkZWRmdjc5NHdDRmJSdjF4WDl4bzAwejMwU2k2NXJ6cTVaVVU4dUt2ZmNPeVJ1cDJkTC9SOUgvODVUblNLbEVXUnErSGo3dw0KMzB2YjFaeU1acU5iRVZnb25VSTUrcmlPV2wweWUwb2xQTVFoei9CVWhDcU9qOExqR21hTDBCdGpVbVdiTyttU3Vpa0s5Y25md3g0SQ0KV0xUSk1BWjl3OHdkZ0FqamI5bXhJbFJUM3JrU3VId1RMdGF0VkdJcGovVDAvdk5nQzNUcWgvODJOQnZvYXdoYnl0Z3AwRW9FNWp5bw0KdVhmYVZDZE9IeGp4ZkpyclFFSCt5THFoZXl2MEx2OGJ1b0x0N0pYMi9zM0pJS0J1bFdSZWJHRTMrcmpEMm9sUVJiYklONkdpeDlodQ0KUEprWkFkK0UrcTV1ZFR4OXpFRlJyWVBHVURzL0RLK0JFSk5iYWZGRnllZTBrRzh2YVlmU1NxeFBWcVBrblRzZ2oxdXFqME0xTGFCNQ0KZ1drVU9vVnl4bUtXUEpYd3JqYXlkSUxVeEZ2dkwzZEpHYmV6cnUwK3d1V3A2QXBQVnRkOElaSm4NCg=="</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"mac"</span>:<span class="cm-string">"1659E42FC9D2A2186228C4607A566D78"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-string cm-property">"svcid"</span>:<span class="cm-string">"YSTEST"</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: 314px;"></div><div class="CodeMirror-gutters" style="display: none; height: 314px;"></div></div></div></pre><h4 id='643-交易说明'><span id="chapter6_4_3"><span>6.4.3 交易说明</span></span></h4><blockquote><p><strong><span>服务方主动调用建行生活的接口时,需传递的是服务方编号(由建行生活分配)、RSA密文及签名三个数据。</span></strong></p><ul><li><strong><span>RSA密文</span></strong><span> 是基于RSA对全报文加密,公私钥在系统外相互同步(如,文本文档,在行内通讯软件传输),上文中显示的报文是加密前或解密后的报文格式。</span></li><li><strong><span>签名</span></strong><span> 是针对源报文(未加密)+私钥获取MD5的数据,验签需要接收方先解密密文,获得源报文后自行拼接私钥获取MD5,再验证与接收的MD5签名是否一致,不一致则为报文篡改,不对报文进行处理,直接结束返回异常提示。</span></li><li><strong><span>密文</span></strong><span> 使用cnt字段传输,</span><strong><span>签名</span></strong><span>使用mac传输,所以加密及签名后,实际传输的内容只有svcid=aaaaaaaaa&cnt=xxxxxx&mac=yyyyyyy(aaaaaaaaa 为服务方编号,xxxxxx为密文内容,yyyyyyy为签名内容)</span></li></ul></blockquote><h4 id='644-加解密及签名方法'><span id="chapter6_4_4"><span>6.4.4 加解密及签名方法</span></span></h4><p><span>本章节提供两个文件</span><code>MD5Util.java</code><span>、</span><code>RSAUtil.java</code><span>及</span><code>加解密方法</code><span> (对应文件可在附件中获取)</span></p><ol start='' ><li><a href='#chapter9_4_1'><span>MD5Util.java</span></a></li><li><a href='#chapter9_4_2'><span>RSAUtil.java</span></a></li></ol><ol start='3' ><li><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-variable-3">String</span> <span class="cm-variable">publicKey</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-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> </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> </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></p><p><strong><span>PS</span></strong><span>: 由</span><strong><span>建行生活推送</span></strong><span>给服务方的支付通知会额外携带该笔订单所使用的优惠金额;但是由</span><strong><span>网银直接推送</span></strong><span>的支付通知,只含原订单金额,不包含优惠金额,需要服务方自行向外联平台查询。</span></p><h3 id='71-背景描述'><span>7.1 背景描述</span></h3><p><span>目前对于支付后通知,根据支付方式的不同,有两种通知路径:</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>路径序号</span></th><th><span>支付方式</span></th><th><span>通知路径</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>1</span></td><td><span>钱包支付、龙支付</span></td><td><span>建行网银→建行生活各场景服务方</span></td></tr><tr><td style='text-align:center;' ><span>2</span></td><td><span>钱包支付、龙支付、微信支付</span></td><td><span>建行网银→建行生活→建行生活各场景服务方</span></td></tr></tbody></table></figure><ul><li><span>对于路径1,按照原来的方式保持不变,由建行网银直接通知到各场景服务方。路径1使用的公钥为商户服务平台下载的对应柜台公钥。</span></li><li><span>对于路径2,建行生活收到网银发送的支付通知之后,主动向各场景服务方转发该通知。涉及推送的服务方通知地址,需由场景服务方提供到建行生活运营人员,由建行生活运营人员在后台进行配置。路径2使用的公钥为建行生活专门为场景服务方分配的</span><strong><span>用于支付通知的公钥</span></strong><span>(请联系建行生活平台获取)。</span></li><li><span>对于钱包支付、龙支付使用的通知路径,根据商户服务平台配置的</span><strong><span>服务器反馈地址</span></strong><span>决定。反馈地址设置服务方系统地址,通知走路径1;反馈地址设置建行生活地址,通知走路径2。 </span></li></ul><h3 id='72-字段描述'><span>7.2 </span><span id="chapter7_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><span>PAY_TYPE</span></td><td><span>支付方式</span></td><td><span>CHAR(2)</span></td><td><span>01-微信支付</span><br><span>02-其他支付</span><br><strong><span>该字段不参与签名</span></strong></td></tr><tr><td><span>POSID</span></td><td><span>商户柜台代码</span></td><td><span>CHAR(9)</span></td><td><span>从商户传送的信息中获得</span></td></tr><tr><td><span>BRANCHID</span></td><td><span>分行代码</span></td><td><span>CHAR(9)</span></td><td><span>从商户传送的信息中获得</span></td></tr><tr><td><strong><span>ORDERID</span></strong></td><td><span>定单号</span></td><td><span>CHAR(30)</span></td><td><span>从商户传送的信息中获得</span></td></tr><tr><td><strong><span>PAYMENT</span></strong></td><td><span>付款金额</span></td><td><span>NUMBER(16,2)</span></td><td><span>从商户传送的信息中获得</span><br><strong><span>请商户务必与订单支付金 额比对,确认两者金额一致</span></strong></td></tr><tr><td><strong><span>CURCODE</span></strong></td><td><span>币种</span></td><td><span>CHAR(2)</span></td><td><span>从商户传送的信息中获得</span></td></tr><tr><td><strong><span>REMARK1</span></strong></td><td><span>备注一</span></td><td><span>CHAR(30)</span></td><td><span>从商户传送的信息中获得,禁止送中文(escape后的也不行)</span></td></tr><tr><td><strong><span>REMARK2</span></strong></td><td><span>备注二</span></td><td><span>CHAR(30)</span></td><td><span>从商户传送的信息中获得</span></td></tr><tr><td><strong><span>ACC_TYPE</span></strong></td><td><span>账户类型</span></td><td><span>CHAR(2)</span></td><td> </td></tr><tr><td><strong><span>SUCCESS</span></strong></td><td><span>成功标志</span></td><td><span>CHAR(1)</span></td><td><span>成功-Y,失败-N。</span><font color=red><span>是否支付成功,请以此字段为准</span></font></td></tr><tr><td><span>TYPE</span></td><td><span>接口类型</span></td><td><span>CHAR(1)</span></td><td><span>分行业务人员在 P2 员工渠道后台设置防钓鱼的开关。</span><br><span>1.开关关闭时,无此字段返回且不参与验签。</span><br><span>2.开关打开时,有此字段返回且参与验签。参数值为防钓鱼接口</span></td></tr><tr><td><span>REFERER</span></td><td><span>商户URL</span></td><td><span>CHAR(100)</span></td><td><span>分行业务人员在 P2 员工渠道后台设置防钓鱼开关。</span><br><span>1.开关关闭时,无此字段返回且不参与验签。</span><br><span>2.开关打开时,有此字段返回且参与验签。</span></td></tr><tr><td><span>CLIENTIP</span></td><td><span>客户端IP</span></td><td><span>CHAR(40)</span></td><td><span>客户在商户系统中的IP,即客户登陆(访问)商户系统时使用的IP)分行业务人员在 P2 员工渠道后台设置防钓鱼开关。</span><br><span>1.开关关闭时,无此字段返回且不参与验签。</span><br><span>2.开关打开时,有此字段返回且参与验签。</span></td></tr><tr><td><span>ACCDATE</span></td><td><span>系统记账日期</span></td><td><span>CHAR(8)</span></td><td><span>商户登陆商户后台设置返回记账日期的开关 </span><br><span>1.开关关闭时,无此字段返回且不参与验签。 </span><br><span>2.开关打开时,有此字段返回且参与验签。参数值格 式为 YYYYMMDD (如 20100907)。</span></td></tr><tr><td><span>USRMSG</span></td><td><span>支付账户信息</span></td><td><span>CHAR(100)</span></td><td><span>分行业务人员在 P2 员工渠道后台设置防钓鱼开关和 返回账户信息的开关。 1.开关关闭时,无此字段返回且不参与验签。 2.开关打开但支付失败时, 无此字段返回且不参与验签。 3.开关打开且支付成功时,有此字段返回且参与验签。参数值格式如下:“姓名</span><span>|</span><span>账号加密后的密文”。</span></td></tr><tr><td><span>INSTALLNUM</span></td><td><span>分期期数</span></td><td><span>CHAR(2)</span></td><td><span>从商户传送的信息中获得; 当分期期数为空或无此字 段上送时,无此字段返回 且不参与验签,否则有此字段返回且参与验签。</span></td></tr><tr><td><span>ERRMSG</span></td><td><span>错误信息</span></td><td><span>CHAR(12)</span></td><td><span>该值默认返回为空,商户无需处理,仅需参与验签即可。当有分期期数返回 时,则有ERRMSG字段返回且参与验签,否则无此字段返回且不参与验签。</span></td></tr><tr><td><span>USRINFO</span></td><td><span>客户加密信息</span></td><td><span>CHAR(256)</span></td><td><span>分行业务人员在 P2 员工渠道后台设置防钓鱼开关和客 户信息加密返回的开关。</span><br><span>1.开关关闭时,无此字段返回且不参与验签 </span><br><span>2.开关打开时,有此字段返回且参数验签。参数值格式如下:“证件号密文</span><span>|</span><span>手机号密文”。该字段不可解密。</span></td></tr><tr><td><span>DISCOUNT</span></td><td><span>实付金额</span></td><td><span>NUMBER(16,2)</span></td><td><span>优惠之后的实际支付金额。单位:元。 目前只针对白名单商户返回,无此字段返回时不参与验签,有此字段返回时参与验签。</span></td></tr><tr><td><span>ISECNY</span></td><td><span>是否数币支付</span></td><td><span>CHAR(1)</span></td><td><span>统一支付网关,如果客户使用的是数币支付,服务器通知及页面通知会增加此字段 ISECNY=Y</span></td></tr><tr><td><span>ZHJF</span></td><td><span>积分使用情况</span></td><td><span>VARCHAR(100)</span></td><td><span>返回客户的积分使用情况,</span><br><span>格式如下:{“APnt_Hpn_Num”:”积分发生数量”,”APntCmpt_Amt”:”积分抵扣金额”}</span><br><span>当综合积分字段为空或无此字段上送时,无此字段返回且不参与验签,否则有此字段返回且参与验签。</span><br><strong><span>该字段参与验签的值为encode之后的参数值(URLEncoder utf-8)</span></strong></td></tr><tr><td><span>OPENID</span></td><td><span>客户识别号</span></td><td><span>VARCHAR(128)</span></td><td><span>提交建行的参数RETURN_FIELD打开对应开关才返回该字段。客户识别码,微信、支付宝、龙支付时返回。有该字段返回时(无论返回值是空还是其他),需参与验签,否则无需参与验签。</span></td></tr><tr><td><span>SUB_OPENID</span></td><td><span>用户子标识</span></td><td><span>VARCHAR(128)</span></td><td><span>提交建行的参数RETURN_FIELD打开对应开关才返回该字段。微信支付专有字段。子商户appid下用户唯一标识,如需返回则请求时需要传sub_appid。有该字段返回时(无论返回值是空还是其他),需参与验签,否则无需参与验签。</span></td></tr><tr><td><span>PAYMENT_DETAILS</span></td><td><span>支付详细信息</span></td><td><span>VARCHAR(256)</span></td><td><span>支付详细信息。当RETURN_FIELD字段第四支付详细信息。当RETURN_FIELD字段第四位上送1时返回。字段说明见下方[支付详细信息字段说明]</span><br><span>格式如下:{"TYPE":"ALIPAY","PAY_CHANNEL":"BANKCARD","DEBIT_CREDIT_TYPE":"DEBIT_CARD","THIRD_TRADE_NO":"2018010521001004890523646975"}</span><br><span>为防止特殊字符,建行会将该参数值用utf-8编码进行urlencode,因此商户需先decode之后才能拿到明文。有该字段返回时(无论返回值是空还是其他),需参与验签,否则无需参与验签。</span><br><strong><span>该字段参与验签的值为encode之后的参数值(URLEncoder utf-8)</span></strong></td></tr><tr><td><span>SHYHQ_ENTITY</span></td><td><span>商户优惠券实体</span></td><td><span>JSON</span></td><td><span>目前只针对配置返回该字段的商户返回,无此字段返回且不参与验签,有此字段返回且参与验签。</span><br><span>商户优惠券实体涉及字段示例:</span><br><span>SHYHQ_ENTITY={"TrdPt_DcCp_ID":"第三方优惠券编号","DcCp_Nm":"优惠券名称","Cyc_Pref_Amt":"周期优惠金额","Txn_Prft_Amt":"交易优惠金额","Prmt_Rfnd_Ind":"允许退款标志","Rght_Cgy_Inf":"权益类信息"……}</span><br><span>“权益类信息”格式及参数参考:例:</span><br><span>【P6:{FL1:1,FL2:01,FL3:有价折扣券,FL4:曹操出行50%券,AM1:30.00}】;</span><br><span>FL1-优惠度量,如积分数、券数量;FL2-清算方式,01-后结算,02-在线一笔清算、03-在线异步清算;FL3-优惠类型,如满减活动、满减券、有价券等;FL4-优惠名称,如活动描述或券名称;AM1-优惠金额,AM2-清算金额,AM3-银行出资金额,AM4-商户出资金额,AM5-优惠券面额,AM6-客户实付金额,如有价券客户购买金额,AM7-积分抵扣金额(目前是积分购买有价券专属)。</span><br><span>{}内字段可能持续增加,请商户做好兼容,有该字段返回时需参与验签,否则无需参与验签。</span><br><strong><span>该字段参与验签的值为encode之后的参数值(URLEncoder utf-8)</span></strong></td></tr><tr><td><span>SIGN</span></td><td><span>数字签名</span></td><td><span>CHAR(256)</span></td><td><span>签名字段,对以此行以上字段的签名,由商户方比对</span></td></tr><tr><td><span>CCB_DISCOUNT_AMT</span></td><td><span>建行支付侧优惠金额</span></td><td><span>CHAR(256)</span></td><td><span>在建行支付网关产生的优惠总金额</span><br><strong><span>该字段不参与签名</span></strong><br><strong><span>需使用服务方公钥解密</span></strong></td></tr><tr><td><span>CCB_DISCOUNT_AMT_DESC</span></td><td><span>建行支付侧优惠定义</span></td><td><span>CHAR(256)</span></td><td><span>建行支付侧优惠定义(各金额之和等于建行支付侧优惠金额)</span><br><span>格式:优惠名称=金额</span><span>|</span><span>@</span><span>|</span><span>优惠名称=金额</span><br><span>例如:优惠券A=0.05</span><span>|</span><span>@</span><span>|</span><span>活动A=0.99</span><br><strong><span>该字段不参与签名</span></strong><br><strong><span>需使用服务方公钥解密</span></strong></td></tr><tr><td><span>MRCH_ID</span></td><td><span>商户号</span></td><td><span>CHAR(256)</span></td><td><span>商户编号</span><br><strong><span>该字段不参与签名</span></strong><br><strong><span>需使用服务方公钥解密</span></strong></td></tr><tr><td><span>CRCRD_INSTM_PRD_NUM</span></td><td><span>信用卡分期期数</span></td><td><span>CHAR(30)</span></td><td><span>信用卡分期期数</span><br><strong><span>该字段不参与签名</span></strong><br><strong><span>需使用服务方公钥解密</span></strong></td></tr><tr><td><span>BIGAMT_INSTM_HDCG</span></td><td><span>分期手续费</span></td><td><span>CHAR(30)</span></td><td><span>信用卡分期手续费(单位元)</span><br><strong><span>该字段不参与签名</span></strong><br><strong><span>需使用服务方公钥解密</span></strong></td></tr></tbody></table></figure><p><span>注1:除不参与签名的字段外,</span><strong><span>加粗</span></strong><span>字段为验签时必输字段,其余字段请判断在当且仅当该字段返回时参与验签</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> </td><td> </td><td> </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>支付渠道</span></td><td><span>30</span></td><td><span>N</span></td><td><span>商户可根据该字段获取支付账户的发卡机构。</span><br><span>1.当支付方式为微信时,详见 </span><a href='https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2' target='_blank' class='url'>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2</a><span> 第8点、银行类型;</span><br><span>2.当支付方式为支付宝时,详见i.支付宝的支付渠道说明;</span><br><span>3.当支付方式为建行时,详见 ii.建行的支付渠道说明;</span><br><span>4.当支付方式为银联时,该字段返回为空。</span></td><td><span>BANKCARD</span></td></tr><tr><td><span>DEBIT_CREDIT_TYPE</span></td><td><span>借贷记标识</span></td><td><span>10</span></td><td><span>N</span></td><td><span>借记:DEBIT;贷记:CREDIT。</span><br><span>当支付方式为银联时, 该字段返回为空</span></td><td><span>CREDIT</span></td></tr><tr><td><span>THIRD_TRA DE_NO</span></td><td><span>第三方订单号</span></td><td><span>100</span></td><td><span>N</span></td><td><span>返回支付宝/微信订单号 当支付方式为龙支付或银联时,该字段返回为空</span></td><td><span>2018010521001004890523646975</span></td></tr></tbody></table></figure><p><span>i. 支付宝的支付渠道说明(后续可能增加,请注意兼容)</span></p><figure><table><thead><tr><th><span>支付渠道代码</span></th><th><span>支付渠道说明</span></th></tr></thead><tbody><tr><td><span>COUPON</span></td><td><span>支付宝红包</span></td></tr><tr><td><span>ALIPAYACCOUNT</span></td><td><span>支付宝余额</span></td></tr><tr><td><span>POINT</span></td><td><span>集分宝</span></td></tr><tr><td><span>DISCOUNT</span></td><td><span>折扣券</span></td></tr><tr><td><span>PCARD</span></td><td><span>预付卡</span></td></tr><tr><td><span>MCARD</span></td><td><span>商家储值卡</span></td></tr><tr><td><span>MDISCOUNT</span></td><td><span>商户优惠券</span></td></tr><tr><td><span>MCOUPON</span></td><td><span>商户红包</span></td></tr><tr><td><span>PCREDIT</span></td><td><span>蚂蚁花呗</span></td></tr><tr><td><span>BANKCARD</span></td><td><span>银行卡渠道</span></td></tr></tbody></table></figure><p><span>ii. 建行的支付渠道说明(后续可能增加,请注意兼容)</span></p><figure><table><thead><tr><th><span>支付渠道代码</span></th><th><span>支付渠道说明</span></th></tr></thead><tbody><tr><td><span>LONG_WALLET</span></td><td><span>龙支付钱包</span></td></tr><tr><td><span>CCB_BANKCARD</span></td><td><span>建行卡</span></td></tr><tr><td><span>OTHER_BANKCARD</span></td><td><span>他行卡</span></td></tr></tbody></table></figure><p><span> </span><strong><span>商户通知串格式</span></strong></p><p><span>请注意 TYPE、 REFERER 、 CLIENTIP 、 ACCDATE、 INSTALLNUM、 ERRMSG、USRMSG、USRINFO、DISCOUNT、ZHJF、OPENID、SUB_OPENID、 PAYMENT_DETAILS 只有在满足条件的情况下才会返回。</span></p><p><span>商户通知串样例:</span></p><blockquote><p><span>POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=12&SUCCESS=Y&TYPE=1&REFERER=</span><a href='http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&INSTALLNUM=3&ERRMSG=&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&DISCOUNT=0.01&ZHJF=' target='_blank' class='url'>http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&INSTALLNUM=3&ERRMSG=&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&DISCOUNT=0.01&ZHJF=</a><span>{“APnt_Hpn_Num”:”积分发生数量”,”APntCmpt_Amt”:”积 分 抵 扣 金 额 ”}&OPENID=oUpF8uChLsBIhscta2jEtNGam5sI&SUB_OPENID=oZQ9N5fxh-dig4CtC_cNxTIZ68ZA&PAYMENT_DETAILS=%7B%22TYPE%22%3A%22ALIPAY%22%2C%22PAY_CHANNEL%22%3A%22BANKCARD%22%2C%22DEBIT_CREDIT_TYPE%22%3A%22DEBIT_CARD%22%2C%22THIRD_TRADE_NO%22%3A%222018010521001004890523646975%22%7D&SIGN=317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859</span></p></blockquote><p><strong><span>签名运算原串</span></strong></p><p><span>请注意:红色字体对应的字段必须参与签名;其他字段在商户通知串中有返回时(无论值是否为空),需参与签名,否则无需参与签名。</span></p><p><span>参与签名运算的字符串及其顺序如下:</span></p><blockquote><p><span>POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=12&SUCCESS=Y&TYPE=1&REFERER=</span><a href='http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&INSTALLNUM=3&ERRMSG=&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&DISCOUNT=0.01&ZHJF=' target='_blank' class='url'>http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&INSTALLNUM=3&ERRMSG=&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&DISCOUNT=0.01&ZHJF=</a><span>{“APnt_Hpn_Num”:”积分发生数量”,”APntCmpt_Amt”:”积 分 抵 扣 金 额 ”}&OPENID=oUpF8uChLsBIhscta2jEtNGam5sI&SUB_OPENID=oZQ9N5fxh-dig4CtC_cNxTIZ68ZA&PAYMENT_DETAILS=%7B%22TYPE%22%3A%22ALIPAY%22%2C%22PAY_CHANNEL%22%3A%22BANKCARD%22%2C%22DEBIT_CREDIT_TYPE%22%3A%22DEBIT_CARD%22%2C%22THIRD_TRADE_NO%22%3A%222018010521001004890523646975%22%7D</span></p></blockquote><p><span>注:字符串中变量名必须是大写字母。</span></p><h4 id='723-sign字段说明'><span>7.2.3 </span><span id="chapter7_2_3"><span>SIGN字段说明</span></span></h4><ol start='' ><li><span>商户通知串的格式如下:</span></li></ol><p><span>例1:</span></p><blockquote><p><span>NT_TYPE=YS&PAY_TYPE=01&POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=12&SUCCESS=Y&TYPE=1&REFERER=</span><a href='http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&INSTALLNUM=3&ERRMSG=&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&SIGN=317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859' target='_blank' class='url'>http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&INSTALLNUM=3&ERRMSG=&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&SIGN=317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859</a></p></blockquote><p><span>例2:</span></p><blockquote><p><span>PAYMENT=0.01&POSID=045242025&SUCCESS=Y&PAY_TYPE=01&CCB_DISCOUNT_AMT_DESC=&REMARK1=&REMARK2=YS44000009000152**WXZF&NT_TYPE=YS&MRCH_ID=&ORDERID=210520133844test3yhv&REFERER=&CLIENTIP=11.168.99.30&SIGN=1a4aca34f02c0efab014ff823153a2a07a35a8a8410591a992d4aa9cd7fa1f961b952236a45b4fe37867ad4a7214ecbeae21957dee9c19d3d2f5dcf09c8faca81ceb68119c8dcd53bd1e70c23f60fc03e7cd96b8c0082a1243d688c13aac0bcd9e177c559e40e782e3856ada32de8d8ce0054e35fca2022b8f91b2a1ca2c5e10&ACC_TYPE=WX&CCB_DISCOUNT_AMT=&CURCODE=01&TYPE=1&BRANCHID=310000000</span></p></blockquote><p><strong><span>请注意</span><code>ACC_TYPE</code><span>、</span><code>ACCDATE</code><span>、</span><code>USRMSG</code><span>、</span><code>INSTALLNUM</code><span>、</span><code>ERRMSG</code><span>、</span><code>USRINFO</code><span>只有在满足条件的情况下才会返回。</span></strong><span> 字符串中变量名必须是大写字母。</span></p><ol start='2' ><li><span>获取待签名数据,待签名数据中的字段顺序请参考上述的字段域,字段是否参与签名及顺序请参考</span><a href='#chapter7_2'><span>字段描述</span></a><span> </span></li></ol><p><span>例1:</span></p><blockquote><p><span>POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=12&SUCCESS=Y&TYPE=1&REFERER=</span><a href='http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&INSTALLNUM=3&ERRMSG=&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D' target='_blank' class='url'>http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&INSTALLNUM=3&ERRMSG=&USRINFO=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D</a></p></blockquote><p><span>例2:</span></p><blockquote><p><span>POSID=045242025&BRANCHID=310000000&ORDERID=210520133844test3yhv&PAYMENT=0.01&CURCODE=01&REMARK1=&REMARK2=YS44000009000152**WXZF&ACC_TYPE=WX&SUCCESS=Y&TYPE=1&REFERER=&CLIENTIP=11.168.99.30</span></p></blockquote><ol start='3' ><li><span>获取数字签名域,即 SIGN 字段值,如:</span></li></ol><blockquote><p><span>317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859</span></p></blockquote><ol start='4' ><li><span>将上面步骤中的值,传入验签方法进行验证。</span>
|
||
<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">* 商户的公钥</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">* 建行返回的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">* 签名前的源串,例如:POSID=000000&BRANCHID=110000000&ORDERID=00320995&PAYMENT=0.01&CURCODE=01&REMARK1=test1&REMARK2=test2&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->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->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->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> </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&MRCH_ID=1050000000000000000&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>,<span class="cm-string cm-property">"SUCCESS"</span>: <span class="cm-string">"Y"</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><blockquote><p><span>ORDERID=210520133844test3yhv&MRCH_ID=&REFUND_DTM=20250601120000</span></p></blockquote><p><span>例2:</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><blockquote><p><span>ORDERID=210520133844test3yhv&MRCH_ID=1050000000000000000&REFUND_DTM=20250601120000</span></p></blockquote><ol start='2' ><li><span>获取数字签名域,即 SIGN 字段值,如:</span></li></ol><blockquote><p><span>317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859</span></p></blockquote><ol start='3' ><li><span>验签方法参照</span><a href='#chapter7_2_3'><span>SIGN字段说明</span></a><span>第4点</span></li></ol><h1 id='9-附录'><span>9. </span><span id="chapter9"><span>附录</span></span></h1><h3 id='91-响应字典'><span>9.1 响应字典</span></h3><figure><table><thead><tr><th><span>响应码</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>CLD_ERR_00001</span></td><td><span>建行生活处理失败</span></td></tr><tr><td><span>CLD_SUCCESS</span></td><td><span>建行生活处理成功</span></td></tr></tbody></table></figure><h3 id='92-交易流水标识'><span>9.2 交易流水标识</span></h3><p><strong><span>行外服务方</span></strong><span>:</span>
|
||
<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: 112px;"></div></div></div></pre><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"><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">"uniqueCardPay"</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">"cardNo"</span>: <span class="cm-string">"6210123456784321"</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: 90px;"></div><div class="CodeMirror-gutters" style="display: none; height: 90px;"></div></div></div></pre><h3 id='94-文件参考'><span>9.4 </span><span id="chapter9_4"><span>文件参考</span></span></h3><ol start='' ><li><span id="chapter9_4_1"><span>MD5Util.java</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 cm-text="" cm-zwsp="">
|
||
</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"><</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"><</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 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"><</span> <span class="cm-number">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-tab" role="presentation" cm-text=" "> </span><span class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">hexStr</span>.<span class="cm-variable">append</span>(<span class="cm-string">"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></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">hexStr</span>.<span class="cm-variable">append</span>(<span class="cm-variable-3">Integer</span>.<span class="cm-variable">toHexString</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></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">hexStr</span>.<span class="cm-variable">toString</span>().<span class="cm-variable">toUpperCase</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></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 717px;"></div><div class="CodeMirror-gutters" style="display: none; height: 717px;"></div></div></div></pre><ol start='2' ><li><span id="chapter9_4_2"><span>RSAUtil.java</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 cm-text="" cm-zwsp="">
|
||
</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="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">publicKey</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">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="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">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></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: 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">* 加密内容,明文</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">* 公钥内容</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=" 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">encodedDataStr</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 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">data</span> <span class="cm-operator">=</span> <span class="cm-variable">dataStr</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-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">Key</span> <span class="cm-variable">decodePublicKey</span> <span class="cm-operator">=</span> <span class="cm-variable">getPublicKeyFromBase64KeyEncodeStr</span>(<span class="cm-variable">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-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">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">ENCRYPT_MODE</span>, <span class="cm-variable">decodePublicKey</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">data</span>.<span class="cm-variable">length</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">></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">></span> <span class="cm-variable">MAX_ENCRYPT_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">data</span>, <span class="cm-variable">offSet</span>, <span class="cm-variable">MAX_ENCRYPT_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="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">data</span>, <span class="cm-variable">offSet</span>, <span class="cm-variable">inputLen</span> <span class="cm-operator">-</span> <span class="cm-variable">offSet</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></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">out</span>.<span class="cm-variable">write</span>(<span class="cm-variable">cache</span>, <span class="cm-number">0</span>, <span class="cm-variable">cache</span>.<span class="cm-variable">length</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">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-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">offSet</span> <span class="cm-operator">=</span> <span class="cm-variable">i</span> <span class="cm-operator">*</span> <span class="cm-variable">MAX_ENCRYPT_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></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">out</span>.<span class="cm-variable">toByteArray</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">encodedDataStr</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable-3">String</span>(<span class="cm-variable">encryptBASE64</span>(<span class="cm-variable">encryptedData</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">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-keyword">catch</span> (<span class="cm-variable">Exception</span> <span class="cm-variable">e</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">throw</span> <span class="cm-variable">e</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">finally</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">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-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">out</span>.<span class="cm-variable">close</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">catch</span> (<span class="cm-variable">Exception</span> <span class="cm-variable">e2</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-comment">// TODO: handle 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-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 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 class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">return</span> <span class="cm-variable">encodedDataStr</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: 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">* 解密内容,密文</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">* 私钥</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">></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">></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="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">inputLen</span> <span class="cm-operator">-</span> <span class="cm-variable">offSet</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></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">out</span>.<span class="cm-variable">write</span>(<span class="cm-variable">cache</span>, <span class="cm-number">0</span>, <span class="cm-variable">cache</span>.<span class="cm-variable">length</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">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-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">offSet</span> <span class="cm-operator">=</span> <span class="cm-variable">i</span> <span class="cm-operator">*</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></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">decryptedData</span> <span class="cm-operator">=</span> <span class="cm-variable">out</span>.<span class="cm-variable">toByteArray</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">decodedDataStr</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable-3">String</span>(<span class="cm-variable">decryptedData</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-keyword">catch</span> (<span class="cm-variable">Exception</span> <span class="cm-variable">e</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">throw</span> <span class="cm-variable">e</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">finally</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">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-tab" role="presentation" cm-text=" "> </span><span class="cm-variable">out</span>.<span class="cm-variable">close</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">catch</span> (<span class="cm-variable">Exception</span> <span class="cm-variable">e2</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-comment">// TODO: handle 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-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 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 class="cm-tab" role="presentation" cm-text=" "> </span><span class="cm-keyword">return</span> <span class="cm-variable">decodedDataStr</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></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> |