微信充值技术方案
<h1>修改记录</h1>
<table>
<thead>
<tr>
<th>日期</th>
<th>修改内容</th>
<th>编辑人</th>
</tr>
</thead>
<tbody>
<tr>
<td>2019.01.17</td>
<td>创建文档 v1.0 <br> <a href="http://192.168.1.8:1505/【产品设计部】产品文档/01【FA】游戏线/微信小游戏/微信公众号充值" title="在线方案">在线方案</a> <br> <a href="http://192.168.1.8:1505/【产品设计部】产品文档/01【FA】游戏线/微信小游戏/微信公众号充值/微信小游戏公众号充值V1.0.0原型/#g=1&p=h5银子充值" title="在线原型">在线原型</a></td>
<td>大雄</td>
</tr>
<tr>
<td>2019.01.18</td>
<td>去掉商品信息表</td>
<td>大雄</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>运营</th>
<th>产品</th>
<th>后端</th>
<th>客户端</th>
<th>前端</th>
<th>测试</th>
</tr>
</thead>
<tbody>
<tr>
<td>任印豪</td>
<td>汪路、李青青</td>
<td>周郑君</td>
<td>无</td>
<td>秦露</td>
<td>暂无</td>
</tr>
</tbody>
</table>
<h1>1 系统整体架构设计</h1>
<h2>1.1 背景</h2>
<p>由于苹果政策问题微信小游戏在iOS端无法充值,为解决iOS用户充值诉求,本版本增加微信服务号银子充值功能,使双端用户均能够在微信中完成银子充值。
本版本需求可能扩展点如下:
1.多个公众号共存,每个公众号对应一款游戏
2.一个公众号对应多个游戏</p>
<h2>1.2 架构设计</h2>
<h3>1.2.1 系统架构图</h3>
<p><img src="http://doc.uc108.org:8002/Public/Uploads/2019-01-17/5c4067f3a928d.png" alt="" /></p>
<h2>1.3 关键技术</h2>
<p>技术栈:netcore+mysql+rabbitmq+redis
部署环境:docker容器</p>
<h1>2 数据存储设计</h1>
<h2>2.1 数据库架构设计</h2>
<p>1.数据库采用关系数据库mysql
2.目前业务请求量不明,采用单库单表存储</p>
<h2>2.2 数据库表设计</h2>
<h3><del>2.2.1 商品信息数据表</del></h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>字段名</th>
<th>类型</th>
<th>键/索引</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>ID</td>
<td>int</td>
<td>PK</td>
<td>主键ID</td>
</tr>
<tr>
<td>2</td>
<td>Name</td>
<td>varchar(32)</td>
<td></td>
<td>商品名称</td>
</tr>
<tr>
<td>3</td>
<td>Price</td>
<td>decimal</td>
<td></td>
<td>单价</td>
</tr>
<tr>
<td>4</td>
<td>Alias</td>
<td>varchar(32)</td>
<td></td>
<td>别名</td>
</tr>
<tr>
<td>5</td>
<td>PublicId</td>
<td>int</td>
<td></td>
<td>公众号id</td>
</tr>
<tr>
<td>6</td>
<td>Num</td>
<td>int</td>
<td></td>
<td>数量(对应虚拟物品数量)</td>
</tr>
<tr>
<td>7</td>
<td>GameCode</td>
<td>varchar(8)</td>
<td></td>
<td>游戏缩写</td>
</tr>
<tr>
<td>8</td>
<td>GameId</td>
<td>int</td>
<td></td>
<td>游戏id</td>
</tr>
<tr>
<td>9</td>
<td>IsDel</td>
<td>bit</td>
<td></td>
<td>是否有效</td>
</tr>
</tbody>
</table>
<h3>2.2.2 用户基础数据表(用户对应usercode与openid的关系)</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>字段名</th>
<th>类型</th>
<th>键/索引</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>ID</td>
<td>int</td>
<td>PK</td>
<td>主键ID</td>
</tr>
<tr>
<td>2</td>
<td>OpenId</td>
<td>varchar(32)</td>
<td></td>
<td>OpenId</td>
</tr>
<tr>
<td>3</td>
<td>UnionId</td>
<td>varchar(32)</td>
<td></td>
<td>UnionId</td>
</tr>
<tr>
<td>4</td>
<td>UserCode</td>
<td>varchar(32)</td>
<td></td>
<td>用户标识</td>
</tr>
<tr>
<td>5</td>
<td>PublicId</td>
<td>int</td>
<td></td>
<td>公众号id</td>
</tr>
<tr>
<td>6</td>
<td>GameCode</td>
<td>varchar(8)</td>
<td></td>
<td>游戏缩写</td>
</tr>
<tr>
<td>7</td>
<td>GameId</td>
<td>int</td>
<td></td>
<td>游戏id</td>
</tr>
<tr>
<td>8</td>
<td>IsDel</td>
<td>bit</td>
<td></td>
<td>是否有效</td>
</tr>
</tbody>
</table>
<h3>2.2.3 订单记录表</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>字段名</th>
<th>类型</th>
<th>键/索引</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>ID</td>
<td>int</td>
<td>PK</td>
<td>主键ID</td>
</tr>
<tr>
<td>3</td>
<td>UserCode</td>
<td>varchar(32)</td>
<td></td>
<td>用户标识</td>
</tr>
<tr>
<td>4</td>
<td>PublicId</td>
<td>int</td>
<td></td>
<td>公众号id</td>
</tr>
<tr>
<td>5</td>
<td>GameCode</td>
<td>varchar(8)</td>
<td></td>
<td>游戏缩写</td>
</tr>
<tr>
<td>6</td>
<td>GameId</td>
<td>int</td>
<td></td>
<td>游戏id</td>
</tr>
<tr>
<td>7</td>
<td>GameName</td>
<td>varchar(16)</td>
<td></td>
<td>游戏名称</td>
</tr>
<tr>
<td>8</td>
<td>IsDel</td>
<td>bit</td>
<td></td>
<td>是否有效</td>
</tr>
<tr>
<td>9</td>
<td>UserId</td>
<td>int</td>
<td></td>
<td>用户id</td>
</tr>
<tr>
<td>10</td>
<td>NickName</td>
<td>varchar(32)</td>
<td></td>
<td>用户昵称</td>
</tr>
<tr>
<td>11</td>
<td>AppId</td>
<td>varchar(32)</td>
<td></td>
<td>微信公众号id</td>
</tr>
<tr>
<td>12</td>
<td>OrderNo</td>
<td>varchar(32)</td>
<td></td>
<td>订单号</td>
</tr>
<tr>
<td>13</td>
<td>PayOrderNo</td>
<td>varchar(32)</td>
<td></td>
<td>支付订单号(老徐)</td>
</tr>
<tr>
<td>14</td>
<td>Price</td>
<td>decimal</td>
<td></td>
<td>单价</td>
</tr>
<tr>
<td>15</td>
<td>Num</td>
<td>int</td>
<td></td>
<td>数量(对应虚拟物品数量)</td>
</tr>
<tr>
<td>16</td>
<td>GoodName</td>
<td>varchar(32)</td>
<td></td>
<td>商品名称</td>
</tr>
<tr>
<td>17</td>
<td>GoodId</td>
<td>int</td>
<td></td>
<td>商品id</td>
</tr>
<tr>
<td>18</td>
<td>OrderTimeStamp</td>
<td>long</td>
<td></td>
<td>订单成功时间</td>
</tr>
<tr>
<td>19</td>
<td>OrderCreateTimeStamp</td>
<td>long</td>
<td></td>
<td>订单创建时间</td>
</tr>
<tr>
<td>20</td>
<td>PayTimeStamp</td>
<td>long</td>
<td></td>
<td>支付时间</td>
</tr>
<tr>
<td>21</td>
<td>GoodType</td>
<td>int</td>
<td></td>
<td>物品类型</td>
</tr>
</tbody>
</table>
<h3>2.2.4 订单详情记录表</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>字段名</th>
<th>类型</th>
<th>键/索引</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>ID</td>
<td>int</td>
<td>PK</td>
<td>主键ID</td>
</tr>
<tr>
<td>3</td>
<td>OrderId</td>
<td>int</td>
<td></td>
<td>订单id</td>
</tr>
<tr>
<td>4</td>
<td>Info</td>
<td>text</td>
<td></td>
<td>订单创建结果</td>
</tr>
</tbody>
</table>
<h3>2.2.5 用户token表(过期物理删除)</h3>
<table>
<thead>
<tr>
<th>序号</th>
<th>字段名</th>
<th>类型</th>
<th>键/索引</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>ID</td>
<td>int</td>
<td>PK</td>
<td>主键ID</td>
</tr>
<tr>
<td>3</td>
<td>UserCode</td>
<td>varchar(32)</td>
<td></td>
<td>用户标识</td>
</tr>
<tr>
<td>4</td>
<td>token</td>
<td>varchar(1024)</td>
<td></td>
<td>token</td>
</tr>
<tr>
<td>4</td>
<td>TimeStamp</td>
<td>long</td>
<td></td>
<td>有效期的截至日期</td>
</tr>
</tbody>
</table>
<h3>2.3 参数配置信息</h3>
<pre><code>[{
"Id":11111,//公众号序号
"PAyClientId":"",//充值客户端id
"PaySecurekey":"",//充值客户端Securekey
"AppId":"",//微信appid
"secret":"",//微信secret
"GameAppId":"",//微信小游戏appid
"GameId":"",//微信小游戏id
"GameCode":"",//微信小游戏Code
"GameName":"",//微信小游戏名称
}]</code></pre>
<h1>3 缓存设计</h1>
<h2>3.1 缓存架构设计</h2>
<h3>3.1.1 参数配置缓存</h3>
<p><em>key</em>:wxpaycom:config
<em>缓存结构</em>:hash
<em>filed</em>:{pulicId} //公众号id
<em>value</em>:{pulicId,PAyClientId,PaySecurekey,AppId,secret,GameAppId,GameId,GameName,GameCode}
<em>更新方式</em>:编辑配置触发更新
<em>有效期</em>:永久</p>
<h3>3.1.2 用户信息缓存</h3>
<p><em>key</em>:wxpayuser:UserInfo_{userid}
<em>缓存结构</em>:string
<em>value</em>:{userid,username,NickName,appid,gamecode,gamename}
<em>有效期</em>:0.5H</p>
<h3><del>3.1.3 商品信息缓存</del></h3>
<p><em>key</em>:wxpaygood:good<em>{pulicId}</em>{gamCode}
<em>缓存结构</em>:hash
<em>filed</em>:{goodid}
<em>value</em>:{ID,Price,Alias,Num}
<em>更新方式</em>:人工触发(无后台)
<em>有效期</em>:永久</p>
<h1>4 业务流程(流程/时序图)</h1>
<h2>4.1 初始页面调用流程</h2>
<p><img src="http://doc.uc108.org:8002/Public/Uploads/2019-01-17/5c4063370c340.png" alt="" /></p>
<h2>4.2支付流程</h2>
<p><img src="http://doc.uc108.org:8002/Public/Uploads/2019-01-17/5c4066f2e0907.png" alt="" /></p>
<h1>5 接口设计</h1>
<p>查看<a href="http://doc.uc108.org:8002/index.php?s=/page/3636">接口文档</a> </p>
<h1>6 相关技术文档</h1>
<p>商城接口文档<a href="http://doc.uc108.org:8002/index.php?s=/73&page_id=478">接口文档</a> </p>