Android第三方支付--微信支付

来源:互联网 发布:软件安全性测试文档 编辑:程序博客网 时间:2024/04/29 16:51

转载请标明出处:
http://blog.csdn.net/android_it/article/details/50628486;
本文出自:【fshsoft的CSDN博客】

做了微信支付,下载了Demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题:

一:首先要在微信开发平台注册账号,新增应用,填写正确的包名,正确的签名(MD5中的一串字符冒号去掉,全部小写),当然也会生成的AppID和AppSecret都有用!最后还要花300大洋开通支付功能!

二:分析一下微信支付的流程
这里写图片描述

三:界面交互流程
这里写图片描述

上面都看明白了,接下来就是写代码了

四:这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这个类名
这里写图片描述

五:在AndroidManifest.xml里面配置相关信息

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 启动主页面 -->        <activity            android:name=".ui.activity.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <intent-filter>                <action android:name="android.intent.action.VIEW" />                <category android:name="android.intent.category.DEFAULT" />                <data android:scheme="wx487898a262d23df3" />            </intent-filter>        </activity>        <activity            android:name=".wxapi.WXPayEntryActivity"            android:exported="true"            android:label="@string/title_activity_wxpayentry"            android:launchMode="singleTop" />        <receiver            android:name=".wxpay.AppRegister"            android:permission="com.tencent.mm.plugin.permission.SEND" >            <intent-filter>                <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />            </intent-filter>        </receiver>
    /**     * 首先调用接口,要把一些基本信息作为参数传给服务器     * 比如:金额fee,用户id,标题title等     * 调用成功之后会返回微信所需要的参数,如:     * appid,noncestr,package,partnerid,prepayid,     * timestamp,sign     * 微信支付     */    StringBuffer sb = new StringBuffer();    WeixinPay wpay;    private AlertDialog mDialog;    private AlertDialog.Builder builder;    public void weixinPay() {        // 通过WXAPIFactory工厂,获取IWXAPI的实例        api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);        // 将该app注册到微信        api.registerApp(Constants.APP_ID);        // 调用接口        Params p = new Params();        p.put("fee",fee);        p.put("spbill_create_ip", NetWorkUtils.getLocalIpAddress(this));        String value = "商品标题 " + title;        try {            String title = new String(value.getBytes("UTF-8"));            p.put("body", title);        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        p.put("userId", O.getUser().getId());        p.post(C.URL.WEIXIN_PAY, new ReHandler() {            @Override            public void onSuccess(NetEntity entity) {                wpay = entity.toObj(WeixinPay.class);                PayReq req = new PayReq();                req.appId = wpay.getAppid();// 微信appId                req.packageValue = wpay.getPackageValue();// 包                req.extData = "app data"; // optional                req.timeStamp = wpay.getTimeStamp();// 时间戳                req.partnerId = wpay.getPartnerId();// 商户号"                req.prepayId = wpay.getPrepayId();// 预支付订单号                req.nonceStr = wpay.getNonceStr();// 随机字符串                req.sign = wpay.getSign();// 后台返回的签名                // 本地再次签名                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));                req.sign = genAppSign(signParams);                // 调微信支付                if(api.isWXAppInstalled()&&api.isWXAppSupportAPI()){                    api.sendReq(req);                }else{                    builder = new AlertDialog.Builder(WXPayEntryActivity.this);                    builder.setNeutralButton("关闭",                            new DialogInterface.OnClickListener() {                                @Override                                public void onClick(DialogInterface dialog, int which) {                                    mDialog.dismiss();                                }                            }).setTitle("友情提醒").setMessage("请安装微信客户端");                    mDialog = builder.create();                    mDialog.show();                }            }            @Override            public void onStart() {            }            @Override            public void onFailure(String message) {            }        });    }   private String genAppSign(List<NameValuePair> params) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < params.size(); i++) {            sb.append(params.get(i).getName());            sb.append('=');            sb.append(params.get(i).getValue());            sb.append('&');        }        sb.append("key=");        sb.append(Constants.API_KEY);        this.sb.append("sign str\n" + sb.toString() + "\n\n");        String appSign = MD5.getMessageDigest(sb.toString().getBytes());        Log.e("orion", appSign);        return appSign;    }

六:在WXPayEntryActivity类里面成功之后回调方法onResp()

@Override    public void onResp(BaseResp resp) {        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {            if(resp.errCode==-2){                Toast.makeText(this,"取消付款!", Toast.LENGTH_LONG).show();            }            if(resp.errCode==-1){                Toast.makeText(this,"支付错误!", Toast.LENGTH_LONG).show();            }            if(resp.errCode==0){                queryOrder();//查询接口调用后台服务器查询是否成功            }        }

最后做完之后,一定要签名打包,这个是微信的独家秘笈,你忘了就会跳出-1,呵呵。

最后总结一下支付返回-1的情况
1.检查微信后台的签名,包名是否正确
2.工程是否签名打包
3.如果之前做过测试显示过-1的情况,必须清除微信的清除数据,重新登录微信
4.后台服务器是否按照要求第一次签名,第二次签名,如果第二次签名不对,那我们就自己再次签名一次,我的代码里面写了

以上就是微信支付的全部内容,如果大家还有什么问题可以给我留言交流。谢谢!

2 0
原创粉丝点击