android微信支付开发过程
商户接入微信支付,调用API必须遵循以下规则:
表4.1 接口规则
传输方式 为保证交易安全性,采用HTTPS传输
提交方式 采用POST方法提交
数据格式 提交和返回数据都为XML格式,根节点名为xml
字符编码 统一采用UTF-8字符编码
签名算法 MD5,后续会兼容SHA1、SHA256、HMAC等。
签名要求 请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法
证书要求 调用申请退款、撤销订单接口需要商户证书
判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态
一、支付流程:1、首先是把该app注册到微信,
2、发起一个线程生成支付订单。这里要注意金额的单位为分,只能为整数。
3、把支付订单post到后台生成一个预支付订单,返回prepay_id(预支付回话标识)
4、将参数再次签名传输给app发起支付,
5、支付结果会在WXPayEntryActivity类里onResp函数中查看,当errCode为:0表示成功 -1表示错误 -2表示用户取消。
二、代码实现部分
2.1 在androidmanifest.xml中注册。
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
</activity>
<receiver android:name="net.sourceforge.simcpux.AppRegister">
<intent-filter>
<action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
</intent-filter>
</receiver>
2.2 把libammsdk.jar拷贝到项目的libs里。
2.3 将该app注册到微信
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp("APP_ID");
2.4 发起一个线程生成支付订单。
GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
getPrepayId.execute();
private class GetPrepayIdTask extends
AsyncTask<Void, Void, Map<String, String>> {
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Map<String, String> result) {
//生成预付单的结果
sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n");
resultunifiedorder = result;
genPayReq();
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected Map<String, String> doInBackground(Void... params) {
String url = String
.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
//生成的支付订单
String entity = genProductArgs();
//把生成的支付订单post生成预付单
byte[] buf = Util.httpPost(url, entity);
String content = new String(buf);
Map<String, String> xml = decodeXml(content);
return xml;
}
}
生成支付订单。
private String genProductArgs() {
StringBuffer xml = new StringBuffer();
try {
String nonceStr = genNonceStr();
xml.append("</xml>");
List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
packageParams
.add(new BasicNameValuePair("appid", Constants.APP_ID));
packageParams.add(new BasicNameValuePair("body", name));
packageParams
.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
packageParams.add(new BasicNameValuePair("notify_url",
weixinUrl
));
orderCode = genOutTradNo();
packageParams.add(new BasicNameValuePair("out_trade_no",
orderCode));
packageParams.add(new BasicNameValuePair("spbill_create_ip",
"127.0.0.1"));
double totalFee = price*100;
//单位是分
packageParams.add(new BasicNameValuePair("total_fee", String.valueOf((int)totalFee)));
packageParams.add(new BasicNameValuePair("trade_type", "APP"));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair("sign", sign));
String xmlstring = toXml(packageParams);
return new String(xmlstring.toString().getBytes(), "ISO8859-1");
// return xmlstring;
} catch (Exception e) {
Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());
return null;
}
}
// 生成签名参数
private void genPayReq() {
req.appId = Constants.APP_ID;
req.partnerId = Constants.MCH_ID;
req.prepayId = resultunifiedorder.get("prepay_id");
req.packageValue = "Sign=WXPay";
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);
sb.append("sign\n" + req.sign + "\n\n");
if (DEBUG) {
Log.e(TAG, "genPayReq:" + signParams.toString()+" req:"+req.toString());
}
}
2.5 调用微信支付
private void sendPayReq() {
msgApi.registerApp(Constants.APP_ID);
msgApi.sendReq(req);
}
2.6 支付结果判断
在WXPayEntryActivity类中onResp判断。
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if( resp.errCode== GjtcConstant.ZERO)
{
Toast.makeText(this, "支付成功!", Toast.LENGTH_SHORT).show();
}else if(resp.errCode== -1)
{
Toast.makeText(this, "支付错误!", Toast.LENGTH_SHORT).show();
finish();
}else if(resp.errCode== -2)
{
Toast.makeText(this, "用户取消!", Toast.LENGTH_SHORT).show();
finish();
}
}
}
开发过程中遇到的问题
1、生成预支付订单的时候会生成失败。
原因:1、因为金额的单位写错了,单位为分,只为整数。2、签名的问题,因为我开发的运行的app签名与网站上写的不一样。所以这里要注意下。
2、支付返回结果收不到,onResp没有走到。
原因:报名写错了,wxapi.WXPayEntryActivity这个必须放到你app包名下才会收到通知。不然会收不到。
QQ技术交流群: 185140783 欢迎大家讨论。
android微信支付开发过程相关推荐
- android+微信支付
微信支付 目录 微信支付 1 一. 创建应用 2 二. 支付集成 5 1.body字段格式 8 三. 参考网址 12 四. Android Studio的两种模式及签名配置 12 一. 创建应用 1& ...
- android微信支付(问题总结)
android微信支付(问题总结) 2015-08-11 16:26 7541人阅读 评论(7) 收藏 举报 分类: Android开发(1457) 作者同类文章 X 感谢博主的分享:http://b ...
- android支付宝支付开发过程
android支付宝支付开发过程 原文:android支付宝支付开发过程 支付宝开发流程: 1.在支付宝申请一个账号并开通开发者功能和移动支付的功能. 支付宝地址:https://auth.alipa ...
- android微信支付代码,详解android微信支付实例代码
这篇文章主要为大家详细介绍了http://www.php.cn/wiki/1502.html" target="_blank">android微信支付源码,具有一定 ...
- Android 微信支付总结
由于公司运营需要,Android客户端要增加微信支付.在看了几遍官方文档之后,加上之前有集成微信分享的经验,所以很快就把调用微信支付的代码写好了,待微信支付相关接口完成后联调时,才发现山高路远坑深啊! ...
- android微信支付问题总结
首先我们先看一个android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1 当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试andro ...
- android 微信支付接口申请分享
开头不那么多废话直接给大家上过程:1.进入微信开发平台 连接 [微信开发平台](https://open.weixin.qq.com/) 登陆帐号然后选择移动应用接入. 进去进行创建应用,创建的时候要 ...
- android 微信支付问题总结
首先我们先看一个Android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1 当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试andro ...
- Android 微信支付步骤
以前自己写过微信支付,今天让我用h5调用微信支付,结果还浪费了点时间,虽然时间不长. 1.导入jar包 .微信提供的jar包 2.写你的微信支付的代码,其实如果参数都有了就一段代码: public v ...
最新文章
- linux的source命令,linux命令之Source命令
- 高效的密码攻击方法:彩虹表
- GitHub for Windows使用教程(二) 分支的使用
- hp打印机怎么连接电脑_hp打印机驱动怎么安装 惠普打印机驱动程序安装方法【详解】...
- 组合数学—容斥原理与鸽巢原理
- 使用SQL生成SQL语句时单引号的转义处理之q'{}'方法
- mysql存储数组类型的数据_mysql中怎么存储数组
- 两个音轨合并_如何将两个音频连接 多个音频/音乐合并
- SVN Cleanup失败的解决方法
- Test meeting 11.23
- org.springframework.core.styler包解读
- 论坛发帖页面html,为Discuz门户文章和论坛帖子页面添加分享按钮
- 关于STM32 IAP升级之为什么APP执行要0x2FFE0000这个数值的原因(基于STM32F446RET6)
- 荣耀v40怎么样 荣耀v40值得入手吗
- C程序编译时错误与运行时错误
- BZOJ 4239 巴士走读
- 裁员纪实:联想不是我的家[转载]
- Centos7使用yum更新gcc----依赖centos-release-scl源
- Android相册列表和栏目数据表的字段结构
- 外购入库单,金蝶KIS旗舰版盘点机PDA,生产企业仓库条码管理进销存