您的位置:首页 > 移动开发 > 微信开发

Android 微信支付

2016-02-29 00:11 459 查看
刚刚把微信支付做完,由于对微信支付不是很了解,前前后后花费了很多时间,过程中也遇到了很多问题。所以在这里把微信支付的步骤以及过程中需要注意的问题总结一下,供大家参考。

做的时候,由于服务器没有做好接口,对数据进行处理,所以我在刚开始写的时候,把服务器处理数据的工作也做了。其实做完回过头看看,Android端其实需要做的事情很简单。

接下来我们可以通过微信支付开发文档中的交互时序图了解下微信支付的流程。



当用户下单后,会将商品信息传递给商户服务器,商户服务器生成支付订单,商户服务器根据订单号,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。

一:准备工作

1.在微信支付官方网站,下载微信提供的jar包libammsdk.jar;
2.在微信开放平台上获取到公司的APPID
appId = "wxd934565d5a25764f";
在微信商户平台上获取到公司的KEY
KEY="36478DFEC34730B99C38528AD2A33394";
公司的商户号
PARTNERID="1853394371";


二.注册APPID

final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");


三.获取到调取微信支付请求的数据并发起支付请求

当用户下单后,会将商品信息传递给商户服务器,商户服务器生成支付订单,商户服务器根据订单号,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下为需要获取到的参数:

IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign=       "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(req);


四.支付结果回调

参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。

public void onResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
}
}


注意事项:

APPID是微信开发平台的APPID, KEY是微信商户平台的KEY,一定不能弄错了。(还有个APPSecret,这个是用不到的,在微信登录时会用到该值)否则在获取PrepayId的时候,会出现获取不到的问题。返回errCode=-1.(微信返回错误码,但是有时候不会提示具体哪里错了,所以对于传递给微信服务器的值,一定不要弄错了)

网上有很多微信支付的demo,有些把服务器调用统一下单API,获取PrepayId的事情也做了,将APPID,KEY等信息写在代码中,从安全角度考虑,这样是很不安全的。我们只需要做三步:注册APPID, 获取服务器传递过来的参数,调起微信支付,支付回调显示结果。

测试的时候,不能直接跑到手机上进行测试。需要用正式的签名keystore打包后,安装到手机上才能进行支付

微信支付中 单位1代表1分,而不是1元,比如0.01元,在微信中是1,微信中是没有小数的,服务器端要注意此处数据的转换

支付结果回调的类必须在 公司包名.wxapi 下(例如com.baidu.wxapi),否则支付结果回调界面不会显示出来,而且类名必须为WXPayEntryActivity。

服务器在对数据进行签名的时候,所有的参数必须都要按顺序,详见 签名算法

手机必须安装微信,否则无法调起微信支付,所以在微信支付前要进行判断,手机中是否按照微信。

//判断用户是否安装微信
public static boolean isWeixinAvilible(Context context) {
final PackageManager packageManager = context.getPackageManager();// 获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
if (pn.equals("com.tencent.mm")) {
return true;
}
}
}

return false;
}


8.如果觉得自己写的微信支付没有问题,请求支付的参数都没有问题,可是还是无法调起支付,可以尝试清除微信缓存,或者更换测试支付的账号进行测试。

如果有问题,可以QQ沟通交流:2865890548
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 支付 微信