由于项目需求,加入这2个功能记录一些需要注意的地方

一.微信支付

微信支付在2016年4月份左右稍微调整了一下支付过程,但是文档却没怎么更新,这也是百度上为什么那么多开发者都说微信是个大坑. 身为一个大型互联网公司,做的事却无法让人理解.

相比之下,支付宝就好太多了.

微信支付需要注意地方:

1.要先申请 "商家端"账户, 需要提交公司信息, 个人不好申请的. 申请成功后,需要去 创建一个应用

创建应用需要 注意2个地方

1>包名, 如果是Android studio开发 ,这个包名要用如下图所示位置的包名, 而不是 androidmanifest.xml中的,因为他俩可能不一样,要以下图为准,当然如果是eclipse开发那就以androidmanifest.xml里面的包名为准了.

2>签名, 这个签名不能用 debug.keystore(Eclipse的签名后缀是.keystore), 或者 debug.jks(Androidstudio把后缀名换了), 要用自己创建的的签名文件,比如 shop.jsk , shop.keystore去生成签名,或者选择以前自己创建好的,都行,只有不是debug的就行.

android studio生成签名截图如下: 点击Teminal 启动后,输入图中命令,后面是你jks所在位置. 之后回车 输入密码, 得到MD5值, 它就是微信创建应用时用到的签名,需要去掉冒号,把大写全部改成小写即可. 当然微信还给我们提供了签名工具apk, 你可以把自己的工程打包后,安装到手机,然后启动微信的签名apk,输入包名即可得到签名, 你可以拿它对比一下用命令行得到的签名是否一致, 如果不一致那就说明一个问题 " 你的应用没有经过打包" , 不要通过编译工具直接部署 到手机,这样得到的签名是不对的. 一定要是打包后的.

当测试微信的时候,也需要把打包后的apk安装到手机才能测试支付,如果只能调起一次微信,第二次无法调起,那就是签名或者 appid这一块有问题,检查一下. 不过我发现IOS不存在这个问题, 每次都能调起微信.

二.下面说下微信在工程中创建需要注意地方:

1. 如果你的包名是com.xxx.text 那么你需要在test之后创建一个包名 com.xxx.text.wxapi, 必须是wxapi,不能错了. 然后必须拷贝一个类过来:WXPayEntryActivity.java ,这个类的作用是微信支付后,接收微信的支付结果的. 你可以不做任何修改,直接拿来用就行,当然如果你想更改里面的布局,也是完全OK的, 我对他做了一下修改,代码如下, 我修改了2个地方,代码中给出了注释

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";private IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//1.第一个修改的地方 我删掉了,它自带的 布局, 当然如果你想保留,完全OK.因为布局太难看所以我干掉他了api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {//2.这是我修改的第二个地方, 原版的是弹出一个对话框, 我觉得太丑,并且原版也没有给出详细问题提示,只给出了 0, -1 ,-2 这样会让客户不明所以,所以我替换成如下3个文本. 此外   //原版支付后,不会直接跳转到 你的应用,需要按一次 返回键,才行, 所以我加入了finish()便于在提示后,直接返回我的应用if(resp.errCode==0){Toast.makeText(this,"支付成功!",Toast.LENGTH_SHORT).show();}else if(resp.errCode==-1){Toast.makeText(this,"支付失败!",Toast.LENGTH_SHORT).show();}else if(resp.errCode==-2){Toast.makeText(this,"取消支付!",Toast.LENGTH_SHORT).show();
        }finish();}
}

2. androidmainfest.xml 的配置,直接上代码,这里只需要注意一个地方那就是 appid

 <activityandroid:name=".wxapi.WXPayEntryActivity"android:label="@string/app_name"android:exported="true"      //必须为trueandroid:launchMode="singleTop">    //必须单例</activity><receiverandroid:name=".wxapi.AppRegister"><intent-filter><action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" /></intent-filter></receiver>

 <activity android:name=".ui.PayActivity"    //这是我自己定义的支付Activity, 自己修改名字即可android:exported="true"android:launchMode="singleTop"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="wxbdc42b2a35e9884e"/>  //这里就是 APPID ,必须和你申请的 应用的 appid保持一致 .否则无法支付,注意,注意,注意</intent-filter></activity>

3.下面是我项目中的支付代码, 先说下支付流程, 首先你要 让负责接口的,给你一个接口, 这个接口 需要app端传递 商品的基本信息过去,比如 商品名字 , 描述,订单号 ,价格等等.也不需要传递太多东西, 我就传递了 以上我列举的4个 ,有人会问 "微信不是帮我们生成了一个 订单号吗?" 我干嘛还要传递给他, 我传递的这个订单号,是用于退款使用的. 所以我要传递一个, 这个订单号,在我 下单的同时, 会生成一个随机数, 当然这都是 后台 接口弄得,你只需要拿来使用就行了.

说的有点乱了,给个步骤吧

1>传递商品信息给我们自己的后台

2>我们自己的后台会拿着这些商品信息 然后加上 + 商户号id+商户秘钥 (申请商家端时获取的), 给我们app端返回一个json,该json中包含7个字段,需要解析,后面给出代码

3>我们解析后, 通过 api.sendReq(req); 调用微信支付

代码如下:

float total3 = orderTotalPrice * 100;  //注意微信支付付款 是按照分为单位的,需要把商品价格 乘以100 ,然后强转为 int类型 ,这里(int)total3
param ="?ordertype="+"old"+"&sworkOrderCode="+out_trade_no+"&serviceFee=" +(int)total3+"&serviceItem="+orderItem.orderName.trim()+"&serviceClass="+orderItem.serviceItem.trim(); testWxPay(v);//开始解析接口给我们返回的json

参数:old 是,一个版本区分,因为公司的多个app都用到了微信支付,并且他们都有关联,所以你可以直接无视该参数,该参数仅用于我自己的项目参数:out_trade_no 是我从我们的接口获取到的随机订单号参数:(int)total3 是商品价格, "分" 为单位,必须转为 整形, 也不知道 int会不会越界,反正我用了int,你可用long参数:serviceItem 商品名字
参数:serviceClass商品描述

 public void testWxPay(View view) {new Thread(new Runnable() {@Overridepublic void run() {String url = HttpUrl.host1+"WeiXinApi.asmx/CreatePrePay_id"+param;Log.e("xxx",url);ToastUtil.shortToastInBackgroundThread(getActivity(), "获取订单中...");try {byte[] buf = Util.httpGet(url);if (buf != null && buf.length > 0) {String content = new String(buf);Log.e("get server pay params", content);JSONObject json = new JSONObject(content);if (null != json && !json.has("retcode")) {req = new PayReq();req.appId = json.getString("appid");    //appidreq.partnerId = json.getString("partnerid"); //商户号req.prepayId = json.getString("prepayid"); //预支付交易会话idreq.nonceStr = json.getString("noncestr"); //随机字符串,不超过32位req.timeStamp = json.getString("timestamp");//时间戳req.packageValue = json.getString("package");//扩展字段req.sign = json.getString("sign");//签名信息MD5加密后的
ToastUtil.shortToastInBackgroundThread(getActivity(), "正常调起支付");toPay();} else {Log.d("PAY_GET", "返回错误" + json.getString("retmsg"));ToastUtil.shortToastInBackgroundThread(getActivity(), "返回错误" + json.getString("retmsg"));}} else {Log.d("PAY_GET", "服务器请求错误");ToastUtil.shortToastInBackgroundThread(getActivity(), "服务器请求错误");}} catch (Exception e) {Log.e("PAY_GET", "异常:" + e.getMessage());ToastUtil.shortToastInBackgroundThread(getActivity(), "异常:" + e.getMessage());}}}).start();}private void toPay() {// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        api.registerApp(Constants.APP_ID);api.sendReq(req);Log.e("跳转结果--",api.sendReq(req)+"");}private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);toPay();}};

整个支付代码非常少,一共就这么多.  需要注意的一点是, 解析的 7个 参数中, sign 是我们自己服务端 二次加密得到的,这里容易出错, 当然我说的是接口里面容易出错,和我们app端没有半毛钱关系,  因为这个 加密,老版本微信是我们 app端生成的, 新版的 是由接口生成的,我们直接拿来用.

sign 生成过程是: 前6个参数+ 商家秘钥 经过MD5加密就得到了. (这个加密用的前6个参数,需要安装字母排序,不能乱用,商家秘钥不需排序放到最后即可,当然这都是接口的需要完成的,我们app端 了解即可)

如果这个sign 接口没有弄好, 极容易出错,无法调起支付页. 我在做的时候,就是因为接口的生成sign时,少写一个 = 连接符造成的.

------------------------------------------------------------------------------------------------------------------------------------------

三.支付宝支付

支付宝支付相对来说要简单的多了, 比较稳定写得清晰明了,一看即懂.  直接上代码吧 ,我去网络太卡了,刚才写了半天,图片无法加载,把我写得重新毁了,先保存吧,等会再上支付宝的.

流程如下:

1.申请账号,同样需要提交一些公司资料

2.下载需要资源,sdk ,文档什么的, 然后去配置工程

1>在工程中创建一个包存放支付宝所需资源,比如我的

导入alipaySdk-20160427.jar , 目前最新版.

2>androidmainfest.xml中的配置

<!--支付宝--><activityandroid:name="com.alipay.sdk.app.H5PayActivity"  //H5页面, 如果手机没有安装支付宝,调起这个android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind" ></activity><activityandroid:name="com.alipay.sdk.auth.AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind" ></activity>

   权限信息
   <uses-permission android:name="android.permission.INTERNET" />  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3.获取私钥, 公钥

命令如下:

RSA密钥生成命令
生成RSA私钥
openssl>genrsa -out rsa_private_key.pem 1024
生成RSA公钥
openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
将RSA私钥转换成PKCS8格式
openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

命令使用的工具在 这里: E:\支付宝钱包支付接口开发包2.0标准版(20160428)\DEMO\openssl\bin -->  openssl.exe

双击启动,截图如下: 然后输入上面命令,就可以得到了.最后会生成相应的文件,但是后缀好像不是txt,你改成txt就能看了.具体过程文档说的很清楚,我也记不太清了,做了1周就忘记了,这记性 ...

打开红框框中的2个文件,里面就用公钥和私钥信息了, 注意红色部分不能要,只要中间的, 你最好把中间部分回车去掉,改成1行,不然可能会因为回车造成出错

配置貌似也就这么多了吧. 比较少,文档也很清楚.

4.下面给出代码吧,截图了后面数据不能泄露了,公司的信息

此处点击 : "支付宝"支付这个 线性布局,执行支付功能

rlZfb.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {pay(v);}});

 /*** call alipay sdk pay. 调用SDK支付*/public void pay(View v) {if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialoginterface, int i) {//
                            finish();}}).show();return;}//得到订单信息String orderInfo = null;//待支付列表item对象orderInfo = getOrderInfo(orderItem.getServiceCode(), orderTotalPrice);String sign = sign(orderInfo);try {/*** 仅需对sign 做URL编码*/sign = URLEncoder.encode(sign, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}/*** 完整的符合支付宝参数规范的订单信息*/final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();Runnable payRunnable = new Runnable() {@Overridepublic void run() {// 构造PayTask 对象--该对象主要为商户提供订单支付功能PayTask alipay = new PayTask(getActivity());// 调用支付接口,获取支付结果String result = alipay.pay(payInfo, true);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}

/*** create the order info. 创建订单信息* subject 商品名字*/private String getOrderInfo(String subject, float price) {// 签约合作者身份IDString orderInfo = "partner=" + "\"" + PARTNER + "\"";// 签约卖家支付宝账号orderInfo += "&seller_id=" + "\"" + SELLER + "\"";// 商户网站唯一订单号//orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";orderInfo += "&out_trade_no=" + "\"" + out_trade_no + "\"";// 商品名称orderInfo += "&subject=" + "\"" + subject + "\"";// 商品详情//orderInfo += "&body=" + "\"" + body + "\"";// 商品金额orderInfo += "&total_fee=" + "\"" + price + "\"";// 服务器异步通知页面路径 --- 调用服务端地址//orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";//ToastUtils.show(getActivity(),subject+price);Log.e("xxxx", subject + price);orderInfo += "&notify_url=" + "\"" + "http://xxx.xxx.xxx/HomeWorkOrder.asmx/WorkOrderPayed" + "\"";//此处是接口端给的一个 地址,找他们要吧....// 服务接口名称, 固定值orderInfo += "&service=\"mobile.securitypay.pay\"";// 支付类型, 固定值orderInfo += "&payment_type=\"1\"";// 参数编码, 固定值orderInfo += "&_input_charset=\"utf-8\"";// 设置未付款交易的超时时间// 默认30分钟,一旦超时,该笔交易就会自动被关闭。// 取值范围:1m~15d。// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。// 该参数数值不接受小数点,如1.5h,可转换为90m。orderInfo += "&it_b_pay=\"30m\"";// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空orderInfo += "&return_url=\"m.alipay.com\"";// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)// orderInfo += "&paymethod=\"expressGateway\"";return orderInfo;}

大多数都是支付宝代码,贴着也没意思, 只不过修改了订单信息而已. 后面的不再贴了. demo和文档已经非常清楚了. 支付宝退款很简单,只需要发送订单号给我们自己的接口即可,其他的由接口去实现.

以上就是所有代码了.写得不好 ,勿喷!!

转载于:https://www.cnblogs.com/android-zcq/p/5589917.html

Android 微信支付支付宝支付相关推荐

  1. Android项目内简单集成微信和支付宝支付功能

    最近自己公司的项目需要集成微信和支付宝支付,我是个初学者,然后就开始在网上各种搜索相关Demo.最后找了一个自我感觉还不错的Demo,挺适合初学者使用的.在使用之前一定要在微信平台和蚂蚁金服申请权限, ...

  2. Android Study 之 6分钟妥妥集成微信以及支付宝支付

    LZ-Says:来说俩件事儿: 1.一心只为一人用,一言只为一人说~ 2.今天坐公交,末班车,车上只有司机和我,阴森森的,吓死LZ了...一路小跑!!! 前言 (浪费一分钟) 今天,不讲这个,也不讲那 ...

  3. android移动支付——支付宝支付,android开发游戏加速器

    上面的支付流程细化下来就是: 1.浏览商品 2.把要买的商品加入购物车 3.把商品拿到收银台,收银人员处理商品信息 4.告诉收银员支付方式 5.选择支付方式进行支付 6.处理支付结果(成功.失败.取消 ...

  4. android移动支付——支付宝支付

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

  5. 微信和支付宝支付模式详解及实现(.Net标准库)

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  6. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    2019独角兽企业重金招聘Python工程师标准>>> 支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至 ...

  7. 微信,支付宝支付,微信公众号小程序授权等

    微信,支付宝支付,微信公众号小程序授权等 前言 微信支付 微信授权 maven依赖(更新) 前言 最近在公司也做了很多移动端项目,如今微信公众号,小程序又特别火爆,免不了要接触支付,授权这类的业务需求 ...

  8. Android端集成支付宝支付

    Android端集成支付宝支付 1.申请账号及配置变量 支付宝快速接入链接点击打开链接 支付宝扫码或者账号密码登录 下面是支付宝给出的接入介绍 第一步:创建应用并获取APPID 要在您的应用中接入支付 ...

  9. H5页面中调用微信和支付宝支付

    最近在工作中,有个H5页面需要实现微信支付和支付宝支付的功能,现在已经完成,抽个时间写出来,分享给有需要的人. 第一步:先判断当前环境 判断用户所属环境,根据环境不同,执行不同的支付程序. if (/ ...

最新文章

  1. 勤于思考:从客户端中检测到有潜在危险的 Request.Form 值
  2. mysql数据库实验3查询_MySQL数据库实验:任务三 数据库的单表查询设计
  3. mysql 相除 取整数位,psql除法保留小数,实现向上取整和向下取整操作_PostgreSQL_数据库...
  4. npm ERR! Unexpected end of JSON input while parsing near '...on:0.10.3,direc to'
  5. 我的第一个python web开发框架(2)——一个简单的小外包
  6. shell脚本中比较、运算以及格式
  7. DevExpress chartControl 数据绑定
  8. 微信公众号后台开发---永久素材失效
  9. linux安装富士施乐打印机驱动下载,Ubuntu 8.04下安装Xerox打印机记录
  10. java到达时间后自动执行代码_java设置按时间自动执行
  11. yum软件包管理 yum(软件仓库)
  12. 花花的森林(倍增,LCA
  13. 基于SSM的医院医疗管理系统的设计与实现
  14. 升降式止回阀行业调研报告 - 市场现状分析与发展前景预测
  15. 右键新建没有Word怎么办?右键新建添加Word方法!
  16. 《A Comprehensive Study on Waste Segregation Techniques》论文笔记
  17. golang 使用RSA生成公私钥,加密,解密,并使用SHA256进行签名,验证
  18. java动物声音模拟器_动物声音模拟器app|动物声音模拟器下载_v9.2.3_9ht安卓下载...
  19. 跟你聊聊员工的离职成本,细算下来超级恐怖!
  20. 【中国标准】 DRA音频标准是什么概念?

热门文章

  1. Vue项目中使用和清除定时器
  2. IOS 获取摄像头/麦克风/相册 权限
  3. 软件工程全书知识点笔记
  4. 在Android模拟器上怎样模拟GPS功能
  5. 2006年培训学员8万人,每年增长25%,请问按此增长速度,到哪一年培训学员人数将达到20万人?
  6. 数据挖掘十大算法(九):朴素贝叶斯 python和sklearn实现
  7. 国标视频融合监控汇聚云平台的方案实现及场景应用
  8. 装了激光雷达的iPad Pro,还能用鼠标了:苹果新键盘、新iPad Pro、新MacBook Air来了
  9. 你可能不知道的90条冷门知识及网友精彩点评
  10. 保温杯哪种材质最好_保温杯使用什么材质的最好?