Android微信支付的两大坑点

Android微信支付的两大坑点

2015-07-30 09:41 博客园 字号: T |  T
一键收藏,随时查看,分享好友!

并不是所有的BAT的API都是那么好用,微信支付就有不少的坑点,总结一下微信支付实现中出现的坑点

AD:51CTO技术沙龙 | 赋予APP不同凡响的交互和体验>>

并不是所有的BAT的API都是那么好用,微信支付就有不少的坑点,总结一下微信支付实现中出现的坑点

坑点一:

PayReq的参数 sign的生成

PayReq对象有个参数为packageValue

而sign生成时要用到packageValue,但是对应的Key是package,这里的key容易弄错

List<NameValuePair> signParams = new LinkedList<NameValuePair>(); 
signParams.add(new BasicNameValuePair("appid", req.appId)); 
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)); 


坑点二:

支付回调方法

微信使用反射找到对应的类并实现的回调

微信官方给出的说明如下:

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

意思如下:

1、你要在创建个packageName+.wxapi的包,如:你的项目报名:com.android.qq,那你要在该包名下创建个wxapi的包

2、在该包下创建个名为 WXPayEntryActivity的Activity类,并实现 接口 IWXAPIEventHandler ,支付的回调就在该接口的 onResp(BaseResp resp)方法中进行

package com.android.qq.wxapi;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

@Override 
public void onResp(BaseResp resp) { 
//处理支付回调 
} 

三:签名测试

这个算不上坑点洛,很多第三方都要这样才可测试

支付的测试必须对应签名的包,否则无法测试支付功能

=========================另一版本坑点======================

一.   微信开发步骤:
1.
注册registerApp
2.
获取token 
3.
获取prepayid
4.
调用sendReq

二.   服务端签名,安卓客户端具体操作如下:
1.
Constants.java,MD5.java,PayActivity.jav,util.java拷贝到项目下,复制wxapi/WXPayEntryActivity.java到项目下;
2.
修改微信开放平台中后台的包名和签名,可以用腾讯开放平台的签名工具获取签名Gen_Signature_Android.apk
1AndroidManifest.xmlpackage名字和项目包名一样;
2AndroidManifest.xml中添加.wxapi.WXPayEntryActivity(不添加,支付成功后无法跳转到相应的通知Activity界面);
3.
具体调用如下:
        else if(url.endsWith(ProtocolConst.WECHAT_PAY))
        {
            JSONObject json = jo.getJSONObject("data");
            String appid = json.getString("appid");
 
            IWXAPI wxApi = WXAPIFactory.createWXAPI(C1_CheckOutActivity.this, appid, true);
            wxApi.registerApp(appid);
            
            if(!wxApi.isWXAppInstalled())
            {
                ToastView toast = new ToastView(C1_CheckOutActivity.this, "没有安装微信");
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return;
            }            
            if(!wxApi.isWXAppSupportAPI())
            {
                ToastView toast = new ToastView(C1_CheckOutActivity.this, "当前版本不支持支付功能");
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return;
            }            
            PayReq req = new PayReq();           
            req.appId            = json.getString("appid");
            req.partnerId        = json.getString("partnerid");
            req.prepayId        = json.getString("prepayid");
            req.nonceStr        = json.getString("noncestr");
            req.timeStamp        = json.getString("timestamp");
            req.packageValue    = json.getString("package");
            req.sign            = json.getString("sign");
            req.extData            = "app data"; // optional
            wxApi.sendReq(req);
        }
4.
接收支付结果的WXPayEntryActivity中的onResp函数里处理支付结果:
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        String msg = "";
        
        if(resp.errCode == 0)
        {
            msg = "支付成功";
        }
        else if(resp.errCode == -1)
        {
            msg = "已取消支付";
        }
        else if(resp.errCode == -2)
        {
            msg = "支付失败";
        }
    
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
             mDialog = new MyDialog(this, "支付结果", msg);
             mDialog.show();

             mDialog.positive.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {                        
                     mDialog.dismiss();
                     finish();
                 }
             });
             
             mDialog.negative.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {                        
                     mDialog.dismiss();
                     finish();
                 }
             });
        }
    }
.微信遇到的具体问题:
1.
demo中找不到APP_KEY,邮箱发过来的没有此参数,对应文档找到是PaySignKey
2.
测试返回的支付结果是-1,可能产生此问题的地方:包名不一致;应用签名和后台不一致。
3.
如果是客户端demo测试,记得注意价格单位是分(调用失败),body是中文的时候需要字符转换(返回错误ERR_JSON)。
客户端demo测试返回支付结果-1,记得删除微信缓冲数据(设置-》应用程序管理器->选中微信->清除数据)
可以用demo里的debug.keystore来测试,功能修改目录:preferences->android->build->custom debug keystore->browse。


原文:http://mobile.51cto.com/anews-486465.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值