商户接入微信支付,调用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微信支付开发过程相关推荐

  1. android+微信支付

    微信支付 目录 微信支付 1 一. 创建应用 2 二. 支付集成 5 1.body字段格式 8 三. 参考网址 12 四. Android Studio的两种模式及签名配置 12 一. 创建应用 1& ...

  2. android微信支付(问题总结)

    android微信支付(问题总结) 2015-08-11 16:26 7541人阅读 评论(7) 收藏 举报 分类: Android开发(1457) 作者同类文章 X 感谢博主的分享:http://b ...

  3. android支付宝支付开发过程

    android支付宝支付开发过程 原文:android支付宝支付开发过程 支付宝开发流程: 1.在支付宝申请一个账号并开通开发者功能和移动支付的功能. 支付宝地址:https://auth.alipa ...

  4. android微信支付代码,详解android微信支付实例代码

    这篇文章主要为大家详细介绍了http://www.php.cn/wiki/1502.html" target="_blank">android微信支付源码,具有一定 ...

  5. Android 微信支付总结

    由于公司运营需要,Android客户端要增加微信支付.在看了几遍官方文档之后,加上之前有集成微信分享的经验,所以很快就把调用微信支付的代码写好了,待微信支付相关接口完成后联调时,才发现山高路远坑深啊! ...

  6. android微信支付问题总结

    首先我们先看一个android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1 当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试andro ...

  7. android 微信支付接口申请分享

    开头不那么多废话直接给大家上过程:1.进入微信开发平台 连接 [微信开发平台](https://open.weixin.qq.com/) 登陆帐号然后选择移动应用接入. 进去进行创建应用,创建的时候要 ...

  8. android 微信支付问题总结

    首先我们先看一个Android微信支付时遇到的一个错误提示: onPayFinish, errCode = -1 当你参数签名都没有问题的时候,出现这个提示,请按照如下操作: 在你的项目测试andro ...

  9. Android 微信支付步骤

    以前自己写过微信支付,今天让我用h5调用微信支付,结果还浪费了点时间,虽然时间不长. 1.导入jar包 .微信提供的jar包 2.写你的微信支付的代码,其实如果参数都有了就一段代码: public v ...

最新文章

  1. linux的source命令,linux命令之Source命令
  2. 高效的密码攻击方法:彩虹表
  3. GitHub for Windows使用教程(二) 分支的使用
  4. hp打印机怎么连接电脑_hp打印机驱动怎么安装 惠普打印机驱动程序安装方法【详解】...
  5. 组合数学—容斥原理与鸽巢原理
  6. 使用SQL生成SQL语句时单引号的转义处理之q'{}'方法
  7. mysql存储数组类型的数据_mysql中怎么存储数组
  8. 两个音轨合并_如何将两个音频连接 多个音频/音乐合并
  9. SVN Cleanup失败的解决方法
  10. Test meeting 11.23
  11. org.springframework.core.styler包解读
  12. 论坛发帖页面html,为Discuz门户文章和论坛帖子页面添加分享按钮
  13. 关于STM32 IAP升级之为什么APP执行要0x2FFE0000这个数值的原因(基于STM32F446RET6)
  14. 荣耀v40怎么样 荣耀v40值得入手吗
  15. C程序编译时错误与运行时错误
  16. BZOJ 4239 巴士走读
  17. 裁员纪实:联想不是我的家[转载]
  18. Centos7使用yum更新gcc----依赖centos-release-scl源
  19. Android相册列表和栏目数据表的字段结构
  20. 外购入库单,金蝶KIS旗舰版盘点机PDA,生产企业仓库条码管理进销存

热门文章

  1. 【知识建设】信息熵、条件熵、互信息、交叉熵及相对熵(KL散度)
  2. Vue中的过滤器(管道)
  3. gitlab群组多项目下载
  4. 雨水弃流装置详细说明
  5. python时间戳_Python时间戳使用和相互转换详解
  6. simulink模糊逻辑控制器的使用小结
  7. matlab 输入坐标,matlab中坐标希腊符号的输入方法
  8. 基于深度强化学习的室内场景目标驱动视觉导航
  9. 解决 docker 中 zsh: command not found: jupyterlab 问题
  10. 深度学习(PyTorch)——librosa库的使用