最近开发的项目需要集成第三方微信支付,于是查看了微信开放平台的开发指南顺利完成,下面为大家分享一下。

一、在集成之前先到微信开放平台拿到以下三个参数:

项目APP ID,

商户平台的商户号MCH_ID,

项目签名(一般是32位的md5串)。

拿到这三个参数之后就可以开始集成了,添加微信支付官方的包libammsdk.jar。

二:集成微信支付的主要步骤

1.先贴一下微信官方demo的结构图

2.介绍项目结构

(1).demo结构图中,微信的功能都在wxapi包下,在这里请大家注意,WXPayEntryActivity这个activity必须要在wxapi包

下,否则微信支付后没有回调结果.微信支付的结果会在这个activity中的onReq函数中回调,大家根据项目需要重写onRe

sp方法即可.同时微信官方文档指出,安卓客户端不能以微信的回调结果作为判断依据,而是要根据公司的服务器订单信

息根据订单是否支付成功来作为支付是否成功的依据.

(2).Constants类中放置了APP_ID(微信分配的公众账号ID),MCH_ID(微信支付分配的商户号),API_KEY(API秘钥,在商户

平台上设置)这三个参数,就是以上步骤一准备的三个参数。

(3).MD5,MD5Utils,Util这三个类不用修改,PayActivity这个activity就是支付界面,大家可根据项目修改支付界面

3.支付的主要步骤

(1).先生成与支付订单prepay_id

(2).生成签名参数

(3).发起支付

4.对3中的各个步骤逐一说明

(1)先提交支付的各种参数,这一步骤微信推荐在服务器端完成,但是如果公司没有完成这一步,那就必须我们在安卓端完成了.首先开启一个异步任务,根据官方的文档点击打开官方文档发起请求,在异步任务的doInBackground方法中完成生成商品参数的任务,核心代码如下:

@Overrideprotected Map<String, String> doInBackground(Void... params) {String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");String entity = genProductArgs();Log.e("orion", entity);byte[] buf = Util.httpPost(url, entity);String content = new String(buf);Log.e("orion", content);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<>();packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));//微信分配的公众账号IDpackageParams.add(new BasicNameValuePair("body", "APP pay test"));//商品或支付单简要描述packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));//微信支付分配的商户号packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));//随机字符串,不长于32位。推荐随机数生成算法packageParams.add(new BasicNameValuePair("notify_url", "http://121.40.35.3/test"));//接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。packageParams.add(new BasicNameValuePair("out_trade_no", genOutTradNo()));//商户系统内部的订单号packageParams.add(new BasicNameValuePair("spbill_create_ip", "127.0.0.1"));//APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IPpackageParams.add(new BasicNameValuePair("total_fee", "1"));//订单总金额,单位为分packageParams.add(new BasicNameValuePair("trade_type", "APP"));//交易类型String sign = genPackageSign(packageParams);packageParams.add(new BasicNameValuePair("sign", sign));//签名String xmlstring = toXml(packageParams);return xmlstring;} catch (Exception e) {Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());return null;}}

public Map<String, String> decodeXml(String content) {y {
            Map<String, String> xml = new HashMap<String, String>();
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(new StringReader(content));
            int event = parser.getEventType();
            while (event != XmlPullParser.END_DOCUMENT) {

String nodeName = parser.getName();
                switch (event) {
                    case XmlPullParser.START_DOCUMENT:
  break;
                    case XmlPullParser.START_TAG:
                        if ("xml".equals(nodeName) == false) {
                            //实例化student对象
                            xml.put(nodeName, parser.nextText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        break;
                }
                event = parser.next();
            }
            return xml;
        } catch (Exception e) {
            Log.e("orion", e.toString());
        }
        return null;
    }
(2).第二步就是生成签名参数,主要是生成与支付订单prepay_id

private void genPayReq() {req.appId = Constants.APP_ID;//公众账号IDreq.partnerId = Constants.MCH_ID;//商户号req.prepayId = resultunifiedorder.get("prepay_id");//预支付交易会话IDreq.packageValue = "prepay_id=" + resultunifiedorder.get("prepay_id");//暂填写固定值Sign=WXPayreq.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");show.setText(sb.toString());Log.e("orion", signParams.toString());}

(3)然后第三步就是发起微信支付了,请注意支付之前要把app注册到微信

msgApi.registerApp(Constants.APP_ID);

三:特别需要注意的问题,都是我碰到的坑

(1)上面的红色标注是需要大家注意的地方

(2)微信支付的支付金额单位是分,不同于支付宝的支付金额单位(元),大家需要对分转换成元,因为订单金额是int型,所以转换步骤比较多,贴代码

goods_price = ((int) ((Double.parseDouble(goods_price)) * 100)) + "";//分转换为元

(3)微信支付的商品描述如果是中文,则需要对中文进行转码,或者把商品描述改成英文

(4)就是测试微信支付的时候,如果打印的日志没有签名错误,则说明签名没有问题.但是要真正支付的话就要用keystore打包签名出来进行测试,debug测试是不会调出支付界面的

Android开发第三方支付微信支付实例集成过程介绍相关推荐

  1. android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍

    Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...

  2. iOS开发之第三方支付微信支付教程,史上最新最全第三方微信支付方式实现、微信集成教程,微信实现流程

    本章项目demo: https://github.com/zhonggaorong/weixinLoginDemo 本章不讲解: 微信sdk的集成 , 项目集成的文章请参照 (包含微信登录):   h ...

  3. android支付宝支付微信支付封装,如何在Android App中集成支付宝和微信支付功能

    前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介 ...

  4. android移动支付——微信支付

    前言 这里开篇讲解一系列的Android相关的移动支付.移动支付也称为手机支付,用户使用移动的设备,完成对所购买商品或者服务的支付功能.包括远程支付(网上支付.短信支付),近场支付(刷卡.滴卡.pos ...

  5. android移动支付——微信支付,flutter瀑布流内存

    我们这里主要是来学习一下支付宝,微信支付,银联支付和paypal支付 现实生活中的支付就是:去商店浏览商品->把商品加入购物车->把购物车中的商品拿到收银台付款 上面的支付流程细化下来就是 ...

  6. android移动支付——微信支付,360°深入了解Flutter

    国内的移动支付方式: 支付宝,微信,银联,百度钱包,QQ钱包,财付通,京东支付 易宝支付,快钱支付,还有一些第三方的支付什么连连支付之类的 境外的移动支付方式(这里直说一个) :paypal 流程 我 ...

  7. Android如何调用支付宝支付 微信支付

    1.支付宝支付-------------------------- 1,到支付宝官网,下载支付宝集成开发包,看懂里面的关键代码 由于android设备一般用的都是无线支付,所有我们申请的就是支付宝无线 ...

  8. 若依分离版整合IJpay实现第三方支付-(微信支付篇_v2)

    若依分离版整合IJpay实现第三方支付-(微信支付篇_v2) IJpay官网 https://javen205.gitee.io/ijpay/ 文章目录 若依分离版整合IJpay实现第三方支付-(微信 ...

  9. 微信企业支付 服务器根证书,微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法-蜘蛛网博客...

    微信第三方平台微信支付配置没有rootca.pem根证书文件的解决办法我们在通过微信第三方平台制作微信活动的时候,很多情况下都需要用到微信支付接口,例如商城类的微信功能,微砍价.微助力.微秒杀.微拼团 ...

最新文章

  1. C语言 | C语言实现日历打印
  2. Spring MVC初始化参数绑定
  3. 扩展--使用队列来优化递归操作完成文件下载
  4. 深度图压缩之-高低8位拆分保存
  5. ElasticSearch 核心概念介绍_02
  6. HDU 1026 广度优先搜索,BFS+路径的记录
  7. bzoj 1013: [JSOI2008]球形空间产生器sphere(高斯消元)
  8. 表妹即将去读研,我送了她11个建议
  9. 查找和杀掉postgresql堵塞的会话
  10. Linux小知识收集(不断更新)
  11. 修改箱线图的横坐标顺序
  12. 【MATLAB】MATLAB数值计算
  13. (理财十)钱生钱账户,如何理财实现长期目标
  14. 抖音去水印java和js版本
  15. 在Word中如何设置分级标题?
  16. 使用python+ffmpeg批量将视频水平翻转
  17. 美团餐饮SaaS基于StarRocks构建商家数据中台的探索
  18. Ubuntu系列(一):给英特尔NUC重装 ubuntu18.04 的系统
  19. 开源RISC-V 项目Freedom在Arty-7-100T开发板上的实现
  20. java怎样实现动态数组?

热门文章

  1. 下一个阿里云MVP,就是你!专属服务、大咖交流、企业游学等你来!申请就送100元代金券!...
  2. html中ct一般指什么颜色,第七章 CT试题(录入)
  3. itext实现excel转pdf文件
  4. [开源] SEPP——研发协作一站式管理平台
  5. 解决“Invalid bound statement (not found): com.lzj.admin.mapper.GoodsMapper.getGoodsInfoById”报错
  6. 分段式多级离心泵_分段式离心泵,多级分段式离心泵,分段式多级离心泵-长沙中联泵业...
  7. 黑盒测试与白盒测试——总结
  8. 玩转Linux与运维岗(38)
  9. TFTP协议报文过防火墙不通
  10. Mac 安装 TensorFlow 2.7 环境,支持 AMD 显卡