mpay/view/index/doc.html
技术老胡 ee49c2a0d0 1. 开发文档加载速度优化
2. 浏览器跳转支付宝异常修复
2025-03-19 23:17:58 +08:00

896 lines
19 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<head>
<title>开发文档</title>
</head>
<style type="text/css">
body {
font-family: "Helvetica Neue", "Helvetica", "Microsoft Yahei", "微软雅黑", "Lantinghei SC", "STXihei", "WenQuanYi Micro Hei", Arial, sans-serif;
text-align: justify;
margin: auto;
font-size: 14px;
line-height: 1.6em;
color: #333;
background: #fefefe;
padding: 15px;
margin: 30px auto;
position: relative;
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
}
article,
footer,
header,
nav {
margin: 0 auto
}
article {
margin-top: 4em;
margin-bottom: 4em;
min-height: 400px
}
footer {
margin-bottom: 50px
}
video {
margin: 2em 0;
border: 1px solid #ddd
}
nav {
font-size: .9em;
font-style: italic;
border-bottom: 1px solid #ddd;
padding: 1em 0
}
nav p {
margin: 0
}
details {
margin: 15px 0;
}
summary {
cursor: pointer;
padding: 4px;
}
summary:focus {
outline: none;
box-shadow: 0 0 3px #2196F3;
}
.h1,
h1 {
font-size: 2.2em;
}
.h2,
h2 {
font-size: 1.9em;
}
.h3,
h3 {
font-size: 1.6em;
}
.h4,
h4 {
font-size: 1.3em;
}
.h5,
h5 {
font-size: 1.2em;
}
.h6,
h6 {
font-size: 1.1em;
}
.h1,
.h2,
.h3,
.h4,
.h5,
.h6,
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: inherit;
font-weight: 500;
color: #333;
line-height: 1.2em;
padding: 0.3em 0;
margin: 0.8em 0 0.4em 0;
word-break: break-all;
}
.h1,
h1 {
letter-spacing: 1px;
border-bottom: 1px solid #ddd;
}
.h2,
h2 {
padding-bottom: 0.15em;
}
p {
-webkit-hypens: auto;
-moz-hypens: auto;
hyphens: auto;
margin: 10px 0;
}
p,
li,
div,
ul {
word-wrap: break-all;
}
blockquote {
margin-left: 1em;
padding: 10px 15px;
margin: 10px 0 20px 0;
border-left: 10px solid #ddd;
background: #f6f6f6;
}
blockquote p {
margin: 0;
font-weight: 400;
}
pre {
display: block;
padding: 0;
overflow: auto;
margin: 0 0 10px;
font-size: 1em;
line-height: 1.42857143;
word-break: break-all;
word-wrap: break-word;
color: #333;
background: none;
border-radius: 4px
}
code,
kbd,
pre,
samp {
font-family: Consolas, 'Liberation Mono', 'Ubuntu Mono', Menlo, Courier, sans-serif;
}
a {
color: #1980e6;
text-decoration: none
}
a:hover {
text-decoration: underline
}
a img {
border: none
}
img {
max-width: 100%;
}
h1 a,
h1 a:hover {
text-decoration: none
}
hr {
border: 0 none;
height: 4px;
margin: 1.2em 0;
background: rgba(0, 0, 0, 0) url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;
}
@media screen and (min-width: 900px) {
body {
width: 900px;
}
}
ul,
ol {
padding: 0.2em 0 0.2em 2em;
}
table {
border-collapse: collapse;
border-spacing: 0;
margin-bottom: 20px;
}
table thead {
background: #eee;
}
table td,
table th {
padding: .5em;
border: 1px solid #ddd;
line-height: 1.5;
}
.markdown-flow {
background: #fff;
padding: 15px;
}
.markdown-flow .label {
color: #444;
}
.markdown-latex {
text-align: center;
font-size: 1.3em;
color: #000;
margin-bottom: 1.5em;
overflow: hidden;
overflow-x: auto;
}
.latex-inline .katex-display {
display: inline-block;
font-size: 0.8em;
}
.markdown-menu ul {
padding: 0 10px 20px 20px;
}
.markdown-menu li {
font-size: 14px;
list-style: none;
line-height: 1.8em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.markdown-menu-h2 {
padding-left: 2em;
}
.markdown-menu-h3 {
padding-left: 4em;
}
.markdown-menu-h4 {
padding-left: 6em;
}
.markdown-menu-h5 {
padding-left: 8em;
}
.markdown-menu-h6 {
padding-left: 10em;
}
.print-btn {
position: absolute;
padding: 4px 20px;
color: #444;
font-size: 1em;
background: #eee;
background: rgba(200, 200, 200, 0.2);
margin-top: -45px;
right: 15px;
}
.print-btn:hover {
text-decoration: none;
background: #14a2ff;
color: #fff;
}
.hidden {
display: none !important;
}
/*打印样式*/
@media print {
body {
padding: 0 1.5cm;
margin: 0 auto 10px auto;
font-size: 13px;
}
.print-btn {
display: none;
}
}
ol.linenums {
padding-left: 2.5em;
}
ol.linenums li {
list-style-type: decimal !important;
}
</style>
<style type="text/css">
/* 新增样式 */
.doc-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.doc-nav {
position: fixed;
left: 20px;
top: 100px;
width: 200px;
background: #f8f9fa;
padding: 15px;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
@media screen and (max-width: 992px) {
.doc-nav {
display: none;
/* 小屏幕隐藏导航栏 */
}
}
.doc-nav a {
display: block;
padding: 8px 12px;
color: #333;
text-decoration: none;
border-radius: 4px;
transition: all 0.3s;
}
.doc-nav a:hover {
background: #e9ecef;
}
table {
width: 100%;
margin: 20px 0;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
table th {
background: #f8f9fa;
font-weight: 600;
padding: 12px;
text-align: left;
}
table td {
padding: 12px;
border-top: 1px solid #eee;
}
table tr:nth-child(even) {
background: #f8f9fa;
}
table tr:hover {
background: #f1f3f5;
}
code {
background: #f8f9fa;
padding: 2px 6px;
border-radius: 4px;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
}
pre code {
display: block;
padding: 15px;
background: #f8f9fa;
border-radius: 4px;
overflow-x: auto;
}
h3 {
margin-top: 40px;
padding-bottom: 10px;
border-bottom: 2px solid #eee;
}
</style>
<body>
<!-- <a href="javascript:window.print();" class="print-btn">打印(Print)</a> -->
<!-- MarkDown Content -->
<div class="doc-container">
<!-- 新增导航菜单 -->
<div class="doc-nav">
<a href="#toc2">协议规则</a>
<a href="#pay0">页面跳转支付</a>
<a href="#pay1">API接口支付</a>
<a href="#pay2">支付结果通知</a>
<a href="#pay3">MD5签名算法</a>
<a href="#pay4">支付方式列表</a>
<a href="#pay5">设备类型列表</a>
</div>
<h3 id="toc2"><a name="协议规则" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>协议规则
</h3>
<p>请求数据格式application/x-www-form-urlencode</p>
<p>返回数据格式JSON</p>
<p>签名算法MD5</p>
<p>字符编码UTF-8</p>
<h3 id="pay0"><a name="页面跳转支付" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>页面跳转支付</h3>
<p>此接口可用于用户前台直接发起支付使用form表单跳转或拼接成url跳转。</p>
<p>URL地址<a href="javascript:void(0);">
<?php echo $domain ?>/submit.php
</a></p>
<p>请求方式POST 或 GET推荐POST不容易被劫持或屏蔽</p>
<p>请求参数说明:</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>变量名</th>
<th>必填</th>
<th>类型</th>
<th>示例值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>商户ID</td>
<td>pid</td>
<td></td>
<td>Int</td>
<td>1001</td>
<td></td>
</tr>
<tr>
<td>支付方式</td>
<td>type</td>
<td></td>
<td>String</td>
<td>alipay</td>
<td><a href="#pay4">支付方式列表</a></td>
</tr>
<tr>
<td>商户订单号</td>
<td>out_trade_no</td>
<td></td>
<td>String</td>
<td>20160806151343349</td>
<td></td>
</tr>
<tr>
<td>异步通知地址</td>
<td>notify_url</td>
<td></td>
<td>String</td>
<td><a href="javascript:void(0);">http://www.pay.com/notify_url.php</a></td>
<td>服务器异步通知地址</td>
</tr>
<tr>
<td>跳转通知地址</td>
<td>return_url</td>
<td></td>
<td>String</td>
<td><a href="javascript:void(0);">http://www.pay.com/return_url.php</a></td>
<td>页面跳转通知地址</td>
</tr>
<tr>
<td>商品名称</td>
<td>name</td>
<td></td>
<td>String</td>
<td>VIP会员</td>
<td>如超过127个字节会自动截取</td>
</tr>
<tr>
<td>商品金额</td>
<td>money</td>
<td></td>
<td>String</td>
<td>1.00</td>
<td>单位最大2位小数</td>
</tr>
<tr>
<td>业务扩展参数</td>
<td>param</td>
<td></td>
<td>String</td>
<td>没有请留空</td>
<td>支付后原样返回</td>
</tr>
<tr>
<td>签名字符串</td>
<td>sign</td>
<td></td>
<td>String</td>
<td>202cb962ac59075b964b07152d234b70</td>
<td>签名算法<a href="#pay3">点此查看</a></td>
</tr>
<tr>
<td>签名类型</td>
<td>sign_type</td>
<td></td>
<td>String</td>
<td>MD5</td>
<td>默认为MD5</td>
</tr>
</tbody>
</table>
<p>支付方式type不传会跳转到收银台支付</p>
<h3 id="pay1"><a name="API接口支付" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>API接口支付</h3>
<p>此接口可用于服务器后端发起支付请求会返回支付二维码链接或支付跳转url。</p>
<p>URL地址<a href="javascript:void(0);">
<?php echo $domain ?>/mapi.php
</a></p>
<p>请求方式POST</p>
<p>请求参数说明:</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>变量名</th>
<th>必填</th>
<th>类型</th>
<th>示例值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>商户ID</td>
<td>pid</td>
<td></td>
<td>Int</td>
<td>1001</td>
<td></td>
</tr>
<tr>
<td>支付方式</td>
<td>type</td>
<td></td>
<td>String</td>
<td>alipay</td>
<td><a href="#pay4">支付方式列表</a></td>
</tr>
<tr>
<td>商户订单号</td>
<td>out_trade_no</td>
<td></td>
<td>String</td>
<td>20160806151343349</td>
<td></td>
</tr>
<tr>
<td>异步通知地址</td>
<td>notify_url</td>
<td></td>
<td>String</td>
<td><a href="javascript:void(0);">http://www.pay.com/notify_url.php</a></td>
<td>服务器异步通知地址</td>
</tr>
<tr>
<td>跳转通知地址</td>
<td>return_url</td>
<td></td>
<td>String</td>
<td><a href="javascript:void(0);">http://www.pay.com/return_url.php</a></td>
<td>页面跳转通知地址</td>
</tr>
<tr>
<td>商品名称</td>
<td>name</td>
<td></td>
<td>String</td>
<td>VIP会员</td>
<td>如超过127个字节会自动截取</td>
</tr>
<tr>
<td>商品金额</td>
<td>money</td>
<td></td>
<td>String</td>
<td>1.00</td>
<td>单位最大2位小数</td>
</tr>
<tr>
<td>用户IP地址</td>
<td>clientip</td>
<td></td>
<td>String</td>
<td>192.168.1.100</td>
<td>用户发起支付的IP地址</td>
</tr>
<tr>
<td>设备类型</td>
<td>device</td>
<td></td>
<td>String</td>
<td>pc</td>
<td>根据当前用户浏览器的UA判断传入用户所使用的浏览器或设备类型默认为pc<a href="#pay5">设备类型列表</a></td>
</tr>
<tr>
<td>业务扩展参数</td>
<td>param</td>
<td></td>
<td>String</td>
<td>没有请留空</td>
<td>支付后原样返回</td>
</tr>
<tr>
<td>签名字符串</td>
<td>sign</td>
<td></td>
<td>String</td>
<td>202cb962ac59075b964b07152d234b70</td>
<td>签名算法<a href="#pay3">点此查看</a></td>
</tr>
<tr>
<td>签名类型</td>
<td>sign_type</td>
<td></td>
<td>String</td>
<td>MD5</td>
<td>默认为MD5</td>
</tr>
</tbody>
</table>
<p>返回结果json</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>变量名</th>
<th>类型</th>
<th>示例值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>返回状态码</td>
<td>code</td>
<td>Int</td>
<td>1</td>
<td>1为成功其它值为失败</td>
</tr>
<tr>
<td>返回信息</td>
<td>msg</td>
<td>String</td>
<td></td>
<td>失败时返回原因</td>
</tr>
<tr>
<td>订单号</td>
<td>trade_no</td>
<td>String</td>
<td>20160806151343349</td>
<td>支付订单号</td>
</tr>
<tr>
<td>支付跳转url</td>
<td>payurl</td>
<td>String</td>
<td><a href="javascript:void(0);">
<?php echo $domain ?>/pay/wxpay/202010903/
</a>
</td>
<td>如果返回该字段则直接跳转到该url支付</td>
</tr>
<tr>
<td>二维码链接</td>
<td>qrcode</td>
<td>String</td>
<td>weixin://wxpay/bizpayurl?pr=04IPMKM</td>
<td>如果返回该字段则根据该url生成二维码</td>
</tr>
<tr>
<td>小程序跳转url</td>
<td>urlscheme</td>
<td>String</td>
<td>weixin://dl/business/?ticket=xxx</td>
<td>如果返回该字段则使用js跳转该url可发起微信小程序支付</td>
</tr>
</tbody>
</table>
<p>payurl、qrcode、urlscheme 三个参数只会返回其中一个</p>
<h3 id="pay2"><a name="支付结果通知" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>支付结果通知</h3>
<p>通知类型服务器异步通知notify_url、页面跳转通知return_url</p>
<p>请求方式GET</p>
<p>请求参数说明:</p>
<table>
<thead>
<tr>
<th>字段名</th>
<th>变量名</th>
<th>必填</th>
<th>类型</th>
<th>示例值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>商户ID</td>
<td>pid</td>
<td></td>
<td>Int</td>
<td>1001</td>
<td></td>
</tr>
<tr>
<td>易支付订单号</td>
<td>trade_no</td>
<td></td>
<td>String</td>
<td>20160806151343349021</td>
<td>聚合易支付订单号</td>
</tr>
<tr>
<td>商户订单号</td>
<td>out_trade_no</td>
<td></td>
<td>String</td>
<td>20160806151343349</td>
<td>商户系统内部的订单号</td>
</tr>
<tr>
<td>支付方式</td>
<td>type</td>
<td></td>
<td>String</td>
<td>alipay</td>
<td><a href="#pay4">支付方式列表</a></td>
</tr>
<tr>
<td>商品名称</td>
<td>name</td>
<td></td>
<td>String</td>
<td>VIP会员</td>
<td></td>
</tr>
<tr>
<td>商品金额</td>
<td>money</td>
<td></td>
<td>String</td>
<td>1.00</td>
<td></td>
</tr>
<tr>
<td>支付状态</td>
<td>trade_status</td>
<td></td>
<td>String</td>
<td>TRADE_SUCCESS</td>
<td>只有TRADE_SUCCESS是成功</td>
</tr>
<tr>
<td>业务扩展参数</td>
<td>param</td>
<td></td>
<td>String</td>
<td></td>
<td></td>
</tr>
<tr>
<td>签名字符串</td>
<td>sign</td>
<td></td>
<td>String</td>
<td>202cb962ac59075b964b07152d234b70</td>
<td>签名算法<a href="#pay3">点此查看</a></td>
</tr>
<tr>
<td>签名类型</td>
<td>sign_type</td>
<td></td>
<td>String</td>
<td>MD5</td>
<td>默认为MD5</td>
</tr>
</tbody>
</table>
<p>收到异步通知后需返回success以表示服务器接收到了订单通知</p>
<h3 id="pay3"><a name="MD5签名算法" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>MD5签名算法</h3>
<p>1、将发送或接收到的所有参数按照参数名ASCII码从小到大排序a-zsign、sign_type、和空值不参与签名</p>
<p>2、将排序后的参数拼接成URL键值对的格式例如 <code>a=b&amp;c=d&amp;e=f</code>参数值不要进行url编码。</p>
<p>3、再将拼接好的字符串与商户密钥KEY进行MD5加密得出sign签名参数<code>sign = md5 ( a=b&amp;c=d&amp;e=f + KEY )</code> (注意:+
为各语言的拼接符不是字符md5结果为小写。</p>
<p>4、具体签名与发起支付的示例代码可下载SDK查看。</p>
<h3 id="pay4"><a name="支付方式列表" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>支付方式列表</h3>
<table>
<thead>
<tr>
<th>调用值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>alipay</td>
<td>支付宝</td>
</tr>
<tr>
<td>wxpay</td>
<td>微信支付</td>
</tr>
<tr>
<td>unionpay</td>
<td>云闪付</td>
</tr>
</tbody>
</table>
<h3 id="pay5"><a name="设备类型列表" class="reference-link"></a><span
class="header-link octicon octicon-link"></span>设备类型列表</h3>
<table>
<thead>
<tr>
<th>调用值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>pc</td>
<td>电脑浏览器</td>
</tr>
<tr>
<td>mobile</td>
<td>手机浏览器</td>
</tr>
<tr>
<td>qq</td>
<td>手机QQ内浏览器</td>
</tr>
<tr>
<td>wechat</td>
<td>微信内浏览器</td>
</tr>
<tr>
<td>alipay</td>
<td>支付宝客户端</td>
</tr>
</tbody>
</table>
<hr>
</div>
<!-- /MarkDown Content -->
</body>
<html>