微信支付
2016-06-30 16:46
423 查看
Android微信支付
SDK微信
微信支付
Android
文章目录
因为在公司的项目需要接入微信和支付宝支付,因为第一次对接这种开放平台,又是支付相关的,什么key啊,appid啊,一大堆繁琐的事,还有开放平台的文档啊,SDK啊,里面有很多坑,这里把我遇到的几个坑列出来,大家注意避开吧。
一、使用微信官方的提供的demo里的appid等
1.微信接口上手指南:(从“移动应用开发”->“Android接入指南”)建议,先把官方这篇文章看完
2.微信支付接口(从“移动应用开发”->“Android开发手册” )下载官方demo
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 } } |
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代码及文档 } } |
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); } |
微信会回调 WXPayEntryActivity 的public void onResp(BaseResp resp)方法,所以后续操作,放在这个回调函数中操作就可以了。
resp.errCode== 0 :表示支付成功
resp.errCode== -1 :表示支付失败
resp.errCode== -2 :表示取消支付
特别注意:
1.第一次很多同学调试微信的官方demo会遇到这样的问题
解决办法:http://open.weixin.qq.com
(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); |
你可以在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
<
在墨迹的日子
突然觉得生活越来越美好
>
相关文章推荐
- 微信浏览器调试
- 判断分享是不是微信
- 微信支付平台设置及如何获取微信支付所需参数
- ecshop/ectouch最新版JSAPI微信支付V3安装帮助手册
- C#微信公众号与订阅号接口开发示例代码
- 如何辨别一个微信公众号的好坏?
- 微信消息推送渠道建设
- 微信 支付 思维导图(微信红包)
- 微信JS-SDK使用权限签名算法的服务端实现(.net版本)
- ListView具有多种item布局——实现微信对话列
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
- 微信web调试工具
- C#开发微信门户及应用(44)--微信H5页面开发的经验总结
- 不敢说不之—— 十分钟学会搭建微信和微博两种主流框架(纯代码)
- php判断用户客户端是否是微信内置客户端
- nodejs javascript微信开发
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
- 免费的微信编辑器插件调用
- 微信公众号支付开发配置
- 第三方登陆:微信官方登陆