微信支付开发步骤:
首先去申请开通微信支付功能(亦可从网上找到申请开通的方法),这里不详细讲解了,自行百度或者按照微信提示操作,主要讲解接入过程。注册微信,主要的是得到app id和key。下面进入详细接入流程;
1.到微信商户平台,下载安卓支付的Demo
下载地址:
https://pay.weixin.qq.com
2.将下载的demo的libs文件夹下的
libammsdk.jar包,拷贝到自己项目中的libs文件夹下(见下图)
3.在项目上右键,点击properties
4.添加jar包路径(见下图)
5.点击上图中的add jars按钮,之后,在弹出的对话框中,找到自己的项目中的libs文件夹下的libammsdk.jar文件,选中双击。
6. 点击Order and Export按钮,勾选libammsdk.jar包,然后点击ok;(见下图)
7.
创建一个类继承自Application,在入口处注册微信api(在onCreate方法中写入以下代码)
api = WXAPIFactory
.createWXAPI
(this, Constants
.WXAPPID
, true)
;
api
.registerApp
(Constants
.WXAPPID
)
;
//
Constants
.WXAPPID为微信开放平台注册得到的appID8.在需要调用微信支付的地方activity里面,发送订单号和金额给你们自己的后台接口,后台根据订单号和金额去微信生成预支付订单,返回json给你,拿到json进行解析。注意:解析的时候只需要解析以下几个数据就可以了,其他不用解析(特别注意:json返回的sign签名不能使用,最后发起支付请求的sign,是你自己对要请求的参数的签名,下面会给出详情步骤)在需要调用微信支付的地方写入以下代码: 8.1
// 微信支付api声明称全局变量
api
=
WXAPIFactory
.
createWXAPI
(
getApplicationContext
(
)
,
Constants
.
WXAPP_ID
)
;
// 判断是否安装微信
if
(
!
api
.
isWXAppInstalled
(
))
{
return
;
}
// 判断微信版本是否支持支付
if
(
api
.
getWXAppSupportAPI
(
)
<
Build
.
PAY_SUPPORTED_SDK_INT
)
{
return
;
}
8.2:对返回的json进行解析,解析得到以下图中红色标注的4个字段的值,其他3个字段的值是你自己这边填写的。
其他3个字段的值为:
1.package字段的值为
package= “ Sign=WXPay ”;
2. timestamp字段的值为 timestamp= Long .toString(System.currentTimeMillis() / 1000) ;
3. sign字段的值为(这里要根据微信给的签名算法生成签名,具体方法见下图) 这里的key,为申请微信支付时候生成 AppSecret;需要签名的6个字段,首先把这5个字段: appid, partnerid, prepayid, noncestr, timestamp, package按照字段排序进行排序,按照key=value&key2=value2的格式拼接,然后在结尾拼接上(k ey= 申请微信支付时候生成 AppSecret的值)。把拼接好的字符串 进行md5加密,得到签名sign的值 。 不懂的可以在看下图解说:
8.3在注册清单文件中找到,调用微信支付的activity注册信息,加入下面代码:
< intent
-
filter
>
<
action
android
:
name
=
"android.intent.action.VIEW"
/>
<
category
android
:
name
=
"android.intent.category.DEFAULT"
/>
<
data
android
:
scheme
=
"你申请的appId"
/>
<
/intent-filter>
9.现在拿到了调用微信支付的所有字段的值,下面就是调用微信支付了,代码如下:
// 给微信支付设置值,发起调用
PayReq req
=
new
PayReq
(
)
;
req
.
appId
=
json
.
getString
(
"appid"
)
;//json返回的值
req
.
partnerId
=
json
.
getString
(
"mch_id"
)
;
//json返回的值
req
.
prepayId
=
json
.
getString
(
"prepay_id"
)
;
//json返回的值
req
.
nonceStr
=
json
.
getString
(
"nonce_str"
)
;
//json返回的值
req
.
sign
= sign
;//这个签名是用上面的方法生成的签名
req
.
timeStamp
=
Long
.toString(System.currentTimeMillis() / 1000)
;//固定的值
req
.
packageValue
=
"Sign=WXPay"
;//固定的值
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api
.
sendReq
(
req
)
;
10.这样就完成了调用微信支付,但是暂时还收不到支付结果,所以接下来就是要实现微信支付后的回调方法。具体方法如下:1.在你的项目中新建一个包,包名必须为wxapi,否则微信无法回调。比如你的项目包名为com.xixiangfu.test。那么就在test下新建一个包com.xixiangfu.test.wxapi; 然后将下载的微信支付的demo中的WXPayEntryActivity这个类拷贝到这个包下,记得将布局文件也拷贝过去,还有要在AndroidManifest.xml对这个activity进行注册。(如图)
activity注册代码如下:
< activity
android
:
name
=
".wxapi.WXPayEntryActivity"
android
:
exported
=
"true"
android
:
theme
=
"@android:style/Theme.Translucent"
android
:
launchMode
=
"singleTop"
/>
11.这时候很多人就去运行测试了,这就是一个非常大的坑,这是根本无法调用微信支付,你要做的是要给你的app进行签名,要和你微信注册的地方的签名保持一致(可以参考下微信官方给的签名设置方法 :https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 ),完成签名后才可以进行测试。 12.返回结果代码(这里如果要对展示结果的页面进行自定义,可以在这个类 WXPayEntryActivity中进行修改 )
注意: 调用微信支付,如果不能调起,或者返回-1,先检查签名(一般都是签名错误导致的,回去重新检查签名)、包名是否与开放平台上面的一致,若一致则是服务端的问题,一般是服务端签名问题。