`

微信支付接口 For Android 上手指南

 
阅读更多

SDK 的接口和使用请参见微信开放平台上的上手指南( Android) 1和 SDK Sample2。这里主要说
明在正常使用微信 SDK 的第三方 app 上使用微信支付接口的步骤。
准备工作:
在使用接口之前请先保证持有向微信开放平台申请得到的 appid、 appsecret(长度为
32 的字符串,用于获取 access_token)、 appkey(长度为 128 的字符串,用于支付过程中生
成 app_signature)及 partnerkey(微信公众平台商户模块生成的商户密钥) 。
注意: appsecret、 appkey、 partnerkey 不应硬编码到客户端程序中,建议需要用到这
三个字段的过程都在服务器端完成。
一、 获取 access_token
access_token 是 APP 的全局唯一票据, APP 调用各接口时都需使用 access_token。正
常情况下 access_token 有效期为 7200 秒,重复获取将导致上次获取的 access_token 失
效。
APP 可以使用 AppID 和 AppSecret 调用本接口来获取 access_token。 AppID 和 AppSecret
可在开放平台后台获得。注意调用接口时需使用 https 协议。
接口调用请求说明
http 请求方式: GET
https://api.weixin.qq.com/cgibin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明:
参数 是否必须 说明
grant_type 是 获取 access_toke,此处填写 client_credential
appid 是 APP 唯一凭证
secret 是 应用密钥,在微信开放平台提交应用审核通过后获得
返回说明
正常情况下,微信会返回下述 JSON 数据包给开发者:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
参数 说明
1 http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN
2 http://open.weixin.qq.com/download/?lang=zh_CN
2
access_token 获取到的凭证
expires_in
凭证有效时间,单位:秒。正常情况下 access_token
有效期为 7200 秒, 重复获取将导致上次获取的
access_token 失效。
错误时微信会返回错误码等信息, JSON 数据包示例如下(该示例为 AppID 无效错误) :
{"errcode":40013,"errmsg":"invalid appid"}
二、 生成预支付订单
用第一步请求的 access_token 作为参数,通过微信开放平台接口生成预支付订单。 http 请求方式: POST
https://api.weixin.qq.com/pay/genprepay?access_token=ACCESS_TOKEN
Url 中的参数只包含目前微信公众平台凭证 access_token,详细的订单数据放在 PostData
中,格式为 json,示例如下:
{
"appid":"wwwwb4f85f3a797777",
"traceid":"crestxu",
"noncestr":"111112222233333",
"package":"bank_type=WX&body=XXX&fee_type=1&input_charset=GBK¬ify_url=http%3a%2
f%2f
www.qq.com&out_trade_no=16642817866003386000&partner=1900000109&spbill_create_ip=1
27.0.0.1&total_fee=1&sign=BEEF37AD19575D92E191C1E4B1474CA9",
"timestamp":1381405298,
"app_signature":"53cca9d47b883bd4a5c85a9300df3da0cb48565c",
"sign_method":"sha1"
} 其
中, 各字段含义如下: 参数 是否必须 说明
appid 是 应用唯一标识,在微信开放平台提交应用审核通
过后获得
traceid 商家对用户的唯一标识,如果用微信 SSO,此处建议填写
授权用户的 openid
noncestr 32位内的随机串, 防重发
package 订单详情( 具体生成方法见后文)
timestamp 时间戳, 为 1970 年 1 月 1 日 00:00 到请求发起时间的秒

app_signature 签名(具体生成方法见后文)
3
sign_method 加密方式,默认为 sha1
返回结果说明:
正确的 Json 返回示例: {"prepayid":"PREPAY_ID","errcode":0,"errmsg":"Success"}
错误的 Json 返回示例:
{"errcode":48001,"errmsg":"api unauthorized"}
package 生成方法:
A)对所有传入参数按照字段名的 ASCII 码从小到大排序( 字典序) 后, 使用 URL 键值对的格
式( 即 key1=value1&key2=value2…) 拼接成字符串 string1;
B) 在 string1 最后拼接上 key=partnerKey 得到 stringSignTemp 字符串, 并对
stringSignTemp 进行 md5 运算, 再将得到的字符串所有字符转换为大写, 得到 sign 值
signValue。
C)对 string1 中的所有键值对中的 value 进行 urlencode 转码, 按照 a 步骤重新拼接成字符
串, 得到 string2。对于 js 前端程序,一定要使用函数 encodeURIComponent 进行 urlencode
编码(注意!进行 urlencode 时要将空格转化为%20 而不是+)。
D)将 sign=signValue 拼接到 string1 后面得到最终的 package 字符串。
代码示例如下:
// 构造参数列表
List<NameValuePair> params = new LinkedList<NameValuePair>();
params.add(new BasicNameValuePair("bank_type", "WX"));
params.add(new BasicNameValuePair("body", "千足金箍棒"));
params.add(new BasicNameValuePair("fee_type", "1"));
params.add(new BasicNameValuePair("input_charset", "UTF-8"));
params.add(new BasicNameValuePair("notify_url", "http://weixin.qq.com"));
params.add(new BasicNameValuePair("out_trade_no", genOutTradNo()));
params.add(new BasicNameValuePair("partner", "1900000109"));
params.add(new BasicNameValuePair("spbill_create_ip", "196.168.1.1"));
params.add(new BasicNameValuePair("total_fee", "1"));
// 生成 package
StringBuilder sb = new StringBuilder();
for (int i = 0; i < params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
4
}
sb.append("key=");
sb.append(PARTNER_KEY); // 注意: 不能hardcode在客户端,建议genPackage这个过程都由
服务器端完成
// 进行md5摘要前, params内容为原始内容,未经过url encode处理
String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
return URLEncodedUtils.format(params, "utf-8") + "&sign=" + packageSign;
app_signature 生成方法:
A) 参与签名的字段包括: appid、 appkey、 noncestr、 package、 timestamp 以及 traceid
B) 对所有待签名参数按照字段名的 ASCII 码从小到大排序( 字典序) 后, 使用 URL 键值对的
格式( 即 key1=value1&key2=value2…) 拼接成字符串 string1。
注意:所有参数名均为小写字符
C)对 string1 作签名算法,字段名和字段值都采用原始值,不进行 URL 转义。具体签名算法
为 SHA1 三、 调起微信支付
将第二步生成的 prepayId 作为参数,调用微信 sdk 发送支付请求到微信。
代码示例如下:
PayReq req = new PayReq();
req.appId = Constants.APP_ID;
req.partnerId = Constants.PARTNER_ID;
req.prepayId = result.prepayId;
req.nonceStr = nonceStr;
req.timeStamp = String.valueOf(timeStamp);
req.packageValue = "Sign=" + packageValue;
req.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics