转-Android微信支付
http://blog.fangjie.info/android微信支付/
Android微信支付
一、使用微信官方的提供的demo里的appid等
1.微信接口上手指南:(从“移动应用开发”->“Android接入指南”)建议,先把官方这篇文章看完
2.微信支付接口(从“移动应用开发”->“Android开发手册” )(下载官方demohttps://res.wx.qq.com/paymchres/zh_CN/htmledition/download/wxpay/app_wx_pay_tool_android1d902c.zip)
- Android端接口文档
- SDK for Android
- Sample for Android
- 服务端demo
- 退款及对账开发指南、退款及对账demo
结合官方给的demo和《微信支付接口 For Android 上手指南》文档,可以看出,微信支付总共分为4个步骤:
(1)利用获取APP_ID 和 APP_SECRET 请求获取 access_token
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/*
* 步骤一:获取AccessToken
*/
private class GetAccessTokenTask extends AsyncTask<Void, Void, GetAccessTokenResult> {
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(GetAccessTokenResult result) {
/*
* 根据获得的access token来开启获取支付id的任务
* 开始步骤二:
*/
GetPrepayIdTask getPrepayId = new GetPrepayIdTask(result.accessToken);
getPrepayId.execute();
}
@Override
protected GetAccessTokenResult doInBackground(Void... params) {
//发网络请求获取access token
}
}
|
(2)利用access_token,以及partnerid和APP_KEY生成预支付订单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
private class GetPrepayIdTask extends AsyncTask<Void, Void, GetPrepayIdResult> {
protected void onPreExecute() {
}
@Override
protected void onPostExecute(GetPrepayIdResult result) {
/*
* 获取PrepayId之后 开始步骤三
*/
sendPayReq(result);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected GetPrepayIdResult doInBackground(Void... params) {
//获取PrepayId的操作
//这里面涉及到[package 生成方法]和[app_signature 生成方法]等复杂操作参见demo代码及文档
}
}
|
(3)利用之前的参数以及PARTNER_ID调起微信支付
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
private void sendPayReq (GetPrepayIdResult result) {
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;
List signParams = new LinkedList();
signParams.add( new BasicNameValuePair( "appid", req. appId));
signParams.add( new BasicNameValuePair( "appkey", APP_KEY));
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 = genSign(signParams);
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req);
}
|
(4)支付完成后
微信会回调 WXPayEntryActivity 的public void onResp(BaseResp resp)方法,所以后续操作,放在这个回调函数中操作就可以了。
resp.errCode== 0 :表示支付成功
resp.errCode== -1 :表示支付失败
resp.errCode== -2 :表示取消支付
特别注意:
1.第一次很多同学调试微信的官方demo会遇到这样的问题
解决办法:https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&lang=zh_CN&token=bc77c2a9db0380aca7d29b1418fa0bccc23070d7
(1)、解压sdk demo工程压缩包,并导入到workspace,如下图:
(2)、选择Eclipse顶部菜单Window->Preferences,在弹出的对话框中,选择Android目录下的Build,如下图:
指定Custom debug keystore选项的路径为sdk demo工程目录中的debug.keystore文件,如下图:
并应用该配置。
(3)、运行该sdk_sample工程。
二、当你使用自己申请的appid等参数。
当你在微信开发平台(open.weixin.qq.com)申请一个普通应用时,你会得到:
public static final String APP_ID = “wxd930ea5d5a258f4f”;
private static final String APP_SECRET = “db426a9829e4b49a0dcac7b4162da6b6″;
当你的应用涉及到微信支付功能是,你需要申请微信支付,申请会有些合同啊什么的,审核通过你会收到邮件,邮件中会有
private static final String APP_KEY(PaySignKey) = “L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K”; // wxd930ea5d5a258f4f 对应的支付密钥
除此之外,还有个微信支付商户申请,申请通过后邮件中会回复:
public static final String PARTNER_ID = “1900000109”;
private static final String PARTNER_KEY = “8934e7d15453e97507ef794cf7b0519d”;
然后为了支付的安全起见,最好把支付的前两个步骤放在服务器端完成,客户端请求服务器拿到前两个步骤生成的一些参数,然后在客户端做第三步,调起微信支付。
特别注意:
1.可以弹出微信支付的界面,但是支付之后没有进入回调的Activity:WXPayEntryActivity ?
微信开放平台有个 不成文的规定(文档里没有说明),就是回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
其他的接口回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXEntryActivity.java
而且这两个回调的Activity必须要实现IWXAPIEventHandler的接口 。
2.签名问题,总是弹不出微信支付界面,然后就回调-1 ?
这个问题多半是签名错误,或者keystore,包名,签名不一致导致。
(1)在申请微信开放平台的时候需要填写 应用包名和应用签名(这个签名可以用 apk生成),所以这就需要你用正式的 keystore打包应用测试开放平台的接口。
(2)再有错误,就是你第二步生成Prepayid时的app_signature 生成错误,仔细看下demo和文档。
3.注意配置文件中AndroidManifest.xml
demo里中有这写配置,似乎对微信支付的调起及回调都有影响,还是按照demo里的,加上这部分配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<activity
android:name= ".wxapi.WXEntryActivity"
android:label= "@string/app_name"
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 ="wxd930ea5d5a258f4f"/><!-- 注意这里,似乎对程序有影响,要加上-->
</intent-filter >
</activity >
<receiver
android:name= ".AppRegister">
<intent-filter >
<action android:name= "com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
</intent-filter >
</receiver >
|
三、微信其他接口-分享接口
用过微信支付接口之后,其他的微信接口就简单多了。微信的分享 分为分享到朋友圈和分享给好友(即发送消息)两种。
(1)直接调用SDK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//WXTextObject对象
WXTextObject textObj = new WXTextObject();
textObj. text = text;
//WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg. mediaObject = textObj;
msg. description = text;
//SendMessageToWX.Req对象
SendMessageToWX.Req req = new SendMessageToWX.Req();
req. transaction = buildTransaction("text"); // transaction字段用于唯一标识一个请求
req. message = msg;
req. scene = isTimelineCb.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession ;
req. openId = getOpenId();
// 调用api 接口发送数据到微信
api.sendReq(req);
|
然后调起 分享的对话框之后就是 微信做的操作,分享完成后一样会回到回调的入口,你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXEntryActivity.java
你可以在onResp中做分享完成的后续操作。
(2)还有一种就是不使用SDK方式分享,参见:http://blog.csdn.net/freesonhp/article/details/10296141
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 分享信息到朋友
*
* @param file,假如图片的路径为path,那么file = new File(path);
*/
private void shareToFriend(File file) {
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
intent.setComponent(componentName);
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_TEXT, "测试微信");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
startActivity(intent);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 分享信息到朋友圈
*
* @param file,假如图片的路径为path,那么file = new File(path);
*/
private void shareToTimeLine(File file) {
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
intent.setComponent(componentName);
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
startActivity(intent);
}
|
这种方式的缺点就是你得不到回调,不知道分享是否成功,但却是一种简单的方式。
如果还有其他什么问题:参见另一篇文章http://blog.csdn.net/janice0529/article/details/38051987
转-Android微信支付的更多相关文章
- 解决Android微信支付官方demo运行失败
Android微信支付官方demo运行失败,在此简单记录一下解决步骤 1.httpclient错误 官方给的demo是eclipse的,打开之后提示httpclient的错误,我知道在as下解决htt ...
- android微信支付总结+自己搭建服务器
1.前期注册操作 1-1:微信开发平台:https://open.weixin.qq.com/ 1-2:创建移动应用 签名获取: 1.将自己的apk签名打包,运行到手机上. 2.将微信支付的签名工具, ...
- Android微信支付SDK开发笔记
一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...
- Android 微信支付资料收集
老板要求支持微信支付,收集了些资料做后期参考 http://www.360doc.com/content/15/0214/10/7044580_448519997.shtml http://www.t ...
- Android微信支付SDK开发
一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...
- Android微信支付V3版
由于公司需求做微信APP支付,在集成过程中也遇到各种问题,比如说签名错误,body编码必须为UTF-8.APP端无法调用支付页面直接到支付结果页面.结果为null,code=-1等等: 1.签名错误问 ...
- Android 微信支付步骤
以前自己写过微信支付,今天让我用h5调用微信支付,结果还浪费了点时间,虽然时间不长. 1.导入jar包 .微信提供的jar包 2.写你的微信支付的代码,其实如果参数都有了就一段代码: public v ...
- Android微信支付SDK
App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...
- Android 微信支付&支付宝支付
由于项目需求,加入这2个功能记录一些需要注意的地方 一.微信支付 微信支付在2016年4月份左右稍微调整了一下支付过程,但是文档却没怎么更新,这也是百度上为什么那么多开发者都说微信是个大坑. 身为一个 ...
随机推荐
- java的nio之:java的nio系列教程之channel的概念
一:java的nio的channel Java NIO的通道类似流,但又有些不同: ==>既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. ==>通道可以异步地读写. ...
- [机器学习之13]降维技术——主成分分析PCA
始终贯彻数据分析的一个大问题就是对数据和结果的展示,我们都知道在低维度下数据处理比较方便,因而数据进行简化成为了一个重要的技术.对数据进行简化的原因: 1.使得数据集更易用使用.2.降低很多算法的计算 ...
- 怎么用ABBYY打开PDF文档
我们日常工作中接触的文档大多都是PDF格式的,这种格式的文件需要借助工具才能打开,大家最熟悉的无非就是Adobe了,但你知道吗?除了Adobe,OCR文字识别软件也可以打开PDF文档,比如ABBYY ...
- unity, 在OnDisable里一定要将Cloth禁掉
如果在OnDisable中不将Cloth组件禁掉,则当物体再次激活时布料将变形.
- SwiftyJSON 中文介绍
SwiftyJSON makes it easy to deal with JSON data in Swift. Why is the typical JSON handling in Swift ...
- fetch用法
fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData)=> { console.log(r ...
- Nginx 性能优化
1.安全优化:隐藏Nginx版本号,server_tokens off; 2.安全优化:更改掉默认的用户 user nginx; 3.性能优化: 根据硬件配置,调整nginx worker 进程数 ...
- java指针
import java.util.ArrayList; import java.util.List; public class TestPoint { public static void main( ...
- c# string 数组转 list
string str = "1,11,121,131"; var arr = str.Split(','); List<string> list = new List& ...
- LeetCode "Binary Tree Vertical Order"
BFS + HashTable class Solution { int maxl, minl; unordered_map<int, vector<int>> hm; pub ...