您的位置:首页 > 移动开发 > Android开发

Android 支付开发(支付宝)

2016-09-25 14:40 274 查看
版权声明:本文为博主原创文章,码字不易,转载请注明原文地址,谢谢。

支付宝更新了开发文档,针对最近的支付开发,做一下详细的开发流程总结。

一、接入流程

1.1、第一步:创建应用并获取APPID

创建应用,获取APPID,并且可以申请开通开放产品使用权限,通过APPID您的应用才能正常使用有权限调用的开放产品的接口能力。

具体参考:https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105308&docType=1

1.2、第二步:配置密钥

这一步可以找后台人员配置,也可以自己配置,具体不作详叙,需要用到的是支付宝私钥。

具体参考:https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105310&docType=1

1.3 第三部:集成并配置SDK

下载SDK,添加到项目中。

在商户应用工程的AndroidManifest.xml文件里面添加声明:

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">activity
</span>            <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"com.alipay.sdk.app.H5PayActivity"</span>
<span class="hljs-attribute">android:configChanges</span>=<span class="hljs-value">"orientation|keyboardHidden|navigation"</span>
<span class="hljs-attribute">android:exported</span>=<span class="hljs-value">"false"</span>
<span class="hljs-attribute">android:screenOrientation</span>=<span class="hljs-value">"behind"</span> ></span>
<span class="hljs-tag"></<span class="hljs-title">activity</span>></span>
<span class="hljs-tag"><<span class="hljs-title">activity
</span>            <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"com.alipay.sdk.auth.AuthActivity"</span>
<span class="hljs-attribute">android:configChanges</span>=<span class="hljs-value">"orientation|keyboardHidden|navigation"</span>
<span class="hljs-attribute">android:exported</span>=<span class="hljs-value">"false"</span>
<span class="hljs-attribute">android:screenOrientation</span>=<span class="hljs-value">"behind"</span> ></span>
<span class="hljs-tag"></<span class="hljs-title">activity</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

权限声明:

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.INTERNET"</span> /></span>
<span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.ACCESS_NETWORK_STATE"</span> /></span>
<span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.ACCESS_WIFI_STATE"</span> /></span>
<span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.READ_PHONE_STATE"</span> /></span>
<span class="hljs-tag"><<span class="hljs-title">uses-permission</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">"android.permission.WRITE_EXTERNAL_STORAGE"</span> /></span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

添加混淆:

<code class="hljs avrasm has-numbering">-libraryjars libs/alipaySDK-<span class="hljs-number">20150602.</span>jar

-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.alipay</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.IAlixPay</span>{*<span class="hljs-comment">;}</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.alipay</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.IAlixPay</span>$Stub{*<span class="hljs-comment">;}</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.alipay</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.IRemoteServiceCallback</span>{*<span class="hljs-comment">;}</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.alipay</span><span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.IRemoteServiceCallback</span>$Stub{*<span class="hljs-comment">;}</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.alipay</span><span class="hljs-preprocessor">.sdk</span><span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.PayTask</span>{ public *<span class="hljs-comment">;}</span>
-keep class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.alipay</span><span class="hljs-preprocessor">.sdk</span><span class="hljs-preprocessor">.app</span><span class="hljs-preprocessor">.AuthTask</span>{ public *<span class="hljs-comment">;}</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

1.4、第四步:调用接口



这里看的很清晰,我们需要考虑的是2345678这几步即可。主要说一下获取的订单是签名后的订单信息,并没有将配置信息放在客户端来进行操作,这是为了安全性来考虑的。

构造交易数据并签名必须在商户服务端完成,商户的应用私钥绝对不能保存在商户APP客户端中,也不能从服务端下发。

同步返回的数据,只是一个简单的结果通知,商户确定该笔交易付款是否成功需要依赖服务端收到支付宝异步通知的结果进行判断。

商户系统接收到通知以后,必须通过验签(验证通知中的sign参数)来确保支付通知是由支付宝发送的。建议使用支付宝提供的SDK来完成

1.5、如何调用以及订单参数详解

这一步可以参考修改一下demo。

<code class="hljs lasso has-numbering">    <span class="hljs-keyword">public</span> <span class="hljs-literal">void</span> payV2(View v) {
<span class="hljs-keyword">if</span> (TextUtils<span class="hljs-built_in">.</span>isEmpty(APPID) <span class="hljs-subst">||</span> TextUtils<span class="hljs-built_in">.</span>isEmpty(RSA_PRIVATE)) {
<span class="hljs-literal">new</span> AlertDialog<span class="hljs-built_in">.</span>Builder(this)<span class="hljs-built_in">.</span>setTitle(<span class="hljs-string">"警告"</span>)<span class="hljs-built_in">.</span>setMessage(<span class="hljs-string">"需要配置APPID | RSA_PRIVATE"</span>)
<span class="hljs-built_in">.</span>setPositiveButton(<span class="hljs-string">"确定"</span>, <span class="hljs-literal">new</span> DialogInterface<span class="hljs-built_in">.</span>OnClickListener() {
<span class="hljs-keyword">public</span> <span class="hljs-literal">void</span> onClick(DialogInterface dialoginterface, int i) {
<span class="hljs-comment">//</span>
finish();
}
})<span class="hljs-built_in">.</span>show();
<span class="hljs-keyword">return</span>;
}

<span class="hljs-built_in">Map</span><span class="hljs-subst"><</span><span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span><span class="hljs-subst">></span> <span class="hljs-keyword">params</span> <span class="hljs-subst">=</span> OrderInfoUtil2_0<span class="hljs-built_in">.</span>buildOrderParamMap(APPID);
<span class="hljs-built_in">String</span> orderParam <span class="hljs-subst">=</span> OrderInfoUtil2_0<span class="hljs-built_in">.</span>buildOrderParam(<span class="hljs-keyword">params</span>);
<span class="hljs-built_in">String</span> sign <span class="hljs-subst">=</span> OrderInfoUtil2_0<span class="hljs-built_in">.</span>getSign(<span class="hljs-keyword">params</span>, RSA_PRIVATE);
final <span class="hljs-built_in">String</span> orderInfo <span class="hljs-subst">=</span> orderParam <span class="hljs-subst">+</span> <span class="hljs-string">"&"</span> <span class="hljs-subst">+</span> sign;

Runnable payRunnable <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> Runnable() {

@Override
<span class="hljs-keyword">public</span> <span class="hljs-literal">void</span> run() {
PayTask alipay <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> PayTask(PayDemoActivity<span class="hljs-built_in">.</span>this);
<span class="hljs-built_in">Map</span><span class="hljs-subst"><</span><span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span><span class="hljs-subst">></span> result <span class="hljs-subst">=</span> alipay<span class="hljs-built_in">.</span>payV2(orderInfo, <span class="hljs-literal">true</span>);<span class="hljs-keyword">Log</span><span class="hljs-built_in">.</span>i(<span class="hljs-string">"msp"</span>, result<span class="hljs-built_in">.</span>toString());

Message msg <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> Message();
msg<span class="hljs-built_in">.</span>what <span class="hljs-subst">=</span> SDK_PAY_FLAG;
msg<span class="hljs-built_in">.</span>obj <span class="hljs-subst">=</span> result;
mHandler<span class="hljs-built_in">.</span>sendMessage(msg);
}
};

<span class="hljs-keyword">Thread</span> payThread <span class="hljs-subst">=</span> <span class="hljs-literal">new</span> <span class="hljs-keyword">Thread</span>(payRunnable);
payThread<span class="hljs-built_in">.</span>start();
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

支付行为需要在独立的非ui线程中执行。

支付结果获取和处理:

同步结果

<code class="hljs java has-numbering"><span class="hljs-keyword">private</span> Handler mHandler = <span class="hljs-keyword">new</span> Handler() {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleMessage</span>(Message msg) {
<span class="hljs-annotation">@SuppressWarnings</span>(<span class="hljs-string">"unchecked"</span>)
PayResult payResult = <span class="hljs-keyword">new</span> PayResult((Map<String, String>) msg.obj);
<span class="hljs-javadoc">/**
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
*/</span>
String resultInfo = payResult.getResult();<span class="hljs-comment">// 同步返回需要验证的信息</span>

String resultStatus = payResult.getResultStatus();
<span class="hljs-comment">// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档</span>
<span class="hljs-keyword">if</span> (TextUtils.equals(resultStatus, <span class="hljs-string">"9000"</span>)) {
Toast.makeText(PayDemoActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"支付成功"</span>, Toast.LENGTH_SHORT).show();
} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">// 判断resultStatus 为非"9000"则代表可能支付失败</span>
<span class="hljs-comment">// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)</span>
<span class="hljs-keyword">if</span> (TextUtils.equals(resultStatus, <span class="hljs-string">"8000"</span>)) {
Toast.makeText(PayDemoActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"支付结果确认中"</span>, Toast.LENGTH_SHORT).show();

} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误</span>
Toast.makeText(PayDemoActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"支付失败"</span>, Toast.LENGTH_SHORT).show();

}
}
};
};</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

异步结果:

在订单中返回一个key为notify_url的链接,支付宝会以POST方式调用notify_url传输数据。

支付参数:

<code class="hljs lasso has-numbering"><span class="hljs-built_in">Map</span><span class="hljs-subst"><</span><span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span><span class="hljs-subst">></span> result <span class="hljs-subst">=</span> alipay<span class="hljs-built_in">.</span>payV2(orderInfo, <span class="hljs-literal">true</span>);</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

orderInfo:加签后的订单信息,app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。

true:boolean isShowPayLoading,加载过渡。

订单参数:

<code class="hljs vbscript has-numbering">    <span class="hljs-keyword">public</span> static Map<<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>> buildOrderParamMap(<span class="hljs-built_in">String</span> app_id) {
Map<<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>> keyValues = <span class="hljs-keyword">new</span> HashMap<<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>>();

keyValues.put(<span class="hljs-string">"app_id"</span>, app_id);

keyValues.put(<span class="hljs-string">"biz_content"</span>, <span class="hljs-string">"{\"</span>timeout_express\<span class="hljs-string">":\"</span><span class="hljs-number">30</span>m\<span class="hljs-string">",\"</span>product_code\<span class="hljs-string">":\"</span>QUICK_MSECURITY_PAY\<span class="hljs-string">",\"</span>total_amount\<span class="hljs-string">":\"</span><span class="hljs-number">0.01</span>\<span class="hljs-string">",\"</span>subject\<span class="hljs-string">":\"</span><span class="hljs-number">1</span>\<span class="hljs-string">",\"</span>body\<span class="hljs-string">":\"</span>我是测试数据\<span class="hljs-string">",\"</span>out_trade_no\<span class="hljs-string">":\"" + getOutTradeNo() +  "</span>\<span class="hljs-string">"}"</span>);

keyValues.put(<span class="hljs-string">"charset"</span>, <span class="hljs-string">"utf-8"</span>);

keyValues.put(<span class="hljs-string">"method"</span>, <span class="hljs-string">"alipay.trade.app.pay"</span>);

keyValues.put(<span class="hljs-string">"sign_type"</span>, <span class="hljs-string">"RSA"</span>);

keyValues.put(<span class="hljs-string">"timestamp"</span>, <span class="hljs-string">"2016-07-29 16:55:53"</span>);

keyValues.put(<span class="hljs-string">"version"</span>, <span class="hljs-string">"1.0"</span>);

return keyValues;
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

包含公共参数和业务参数。biz_content是业务参数,其他均是公共参数。



这里虽然不是必须参数,但是还要具体配置,还是写上为好。毕竟别支付到别人账户去了哈哈!

订单加签流程:

请求参数按照key=value&key=value方式拼接的未签名原始字符串:
<code class="hljs java has-numbering">    <span class="hljs-javadoc">/**
* 构造支付订单参数信息
*
*<span class="hljs-javadoctag"> @param</span> map
* 支付订单参数
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">buildOrderParam</span>(Map<String, String> map) {
List<String> keys = <span class="hljs-keyword">new</span> ArrayList<String>(map.keySet());

StringBuilder sb = <span class="hljs-keyword">new</span> StringBuilder();
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < keys.size() - <span class="hljs-number">1</span>; i++) {
String key = keys.get(i);
String value = map.get(key);
sb.append(buildKeyValue(key, value, <span class="hljs-keyword">true</span>));
sb.append(<span class="hljs-string">"&"</span>);
}

String tailKey = keys.get(keys.size() - <span class="hljs-number">1</span>);
String tailValue = map.get(tailKey);
sb.append(buildKeyValue(tailKey, tailValue, <span class="hljs-keyword">true</span>));

<span class="hljs-keyword">return</span> sb.toString();
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

再对原始字符串进行签名
<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
* 对支付参数信息进行签名
*
*<span class="hljs-javadoctag"> @param</span> map
*            待签名授权信息
*
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getSign</span>(Map<String, String> map, String rsaKey) {
List<String> keys = <span class="hljs-keyword">new</span> ArrayList<String>(map.keySet());
<span class="hljs-comment">// key排序</span>
Collections.sort(keys);

StringBuilder authInfo = <span class="hljs-keyword">new</span> StringBuilder();
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < keys.size() - <span class="hljs-number">1</span>; i++) {
String key = keys.get(i);
String value = map.get(key);
authInfo.append(buildKeyValue(key, value, <span class="hljs-keyword">false</span>));
authInfo.append(<span class="hljs-string">"&"</span>);
}

String tailKey = keys.get(keys.size() - <span class="hljs-number">1</span>);
String tailValue = map.get(tailKey);
authInfo.append(buildKeyValue(tailKey, tailValue, <span class="hljs-keyword">false</span>));

String oriSign = SignUtils.sign(authInfo.toString(), rsaKey);
String encodedSign = <span class="hljs-string">""</span>;

<span class="hljs-keyword">try</span> {
encodedSign = URLEncoder.encode(oriSign, <span class="hljs-string">"UTF-8"</span>);
} <span class="hljs-keyword">catch</span> (UnsupportedEncodingException e) {
e.printStackTrace();
}
<span class="hljs-keyword">return</span> <span class="hljs-string">"sign="</span> + encodedSign;
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

具体参考:https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105351&docType=1

最后对请求字符串value进行encode,编码格式按请求串中的charset为准,没传charset按UTF-8处理,获得最终的请求字符串:
<code class="hljs rsl has-numbering"><span class="hljs-comment">// 仅需对sign 做URL编码</span>
<span class="hljs-built_in">sign</span> = URLEncoder.encode(<span class="hljs-built_in">sign</span>, <span class="hljs-string">"UTF-8"</span>);</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

demo已经将2,3合并成一步。

支付结果验证:

当然,前面所述,基本支付功能不成问题,但是为了程序的严谨性和支付的安全性考虑,还是需要对支付结果进行验证。

同步通知验证:

示例:

<code class="hljs tex has-numbering"><span class="hljs-special">{</span>
"memo" : "xxxxx",
"result" : "<span class="hljs-special">{</span>
<span class="hljs-command">\"</span>alipay_trade_wap_pay_response<span class="hljs-command">\"</span>:<span class="hljs-special">{</span>
<span class="hljs-command">\"</span>code<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>10000<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>msg<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>Success<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>app_id<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>2014072300007148<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>out_trade_no<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>081622560194853<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>trade_no<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>2016081621001004400236957647<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>total_amount<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>0.01<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>seller_id<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>2088702849871851<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>charset<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>utf-8<span class="hljs-command">\"</span>
<span class="hljs-special">}</span>,
<span class="hljs-command">\"</span>sign<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********<span class="hljs-command">\"</span>,
<span class="hljs-command">\"</span>sign_type<span class="hljs-command">\"</span>:<span class="hljs-command">\"</span>RSA<span class="hljs-command">\"</span>
<span class="hljs-special">}</span>",
"resultStatus" : "9000"
<span class="hljs-special">}</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

code结果码:



具体意思即验证返回结果信息跟订单信息是否一致,当然验证的参数也比较多

具体参考:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.1N7QWY&treeId=193&articleId=105302&docType=1

异步验证:

这里是服务端做的验证,支付成功后支付宝会吊起notify_url上的链接,返回支付参数,服务端对支付参数进行解析验证。

具体参考:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.q9gQhV&treeId=193&articleId=105301&docType=1

旧版支付当前还在兼容使用,当然需要使用旧版的SDK,具体需要注意的是

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: