一、使用微信官方的提供的demo里的appid等 1.微信接口上手指南:(从“移动应用开发”->“Android接入指南”)建议,先把官方这篇文章看完 ![]() 2.微信支付接口(从“移动应用开发”->“Android开发手册” )(下载官方demo https://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.youkuaiyun.com/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.youkuaiyun.com/janice0529/article/details/38051987 |