Android第三方微信支付教程
程序员文章站
2024-03-05 16:00:43
做了微信支付,下载了demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题:
一、首先要在微信开发平台注册账号,新...
做了微信支付,下载了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.后台服务器是否按照要求第一次签名,第二次签名,如果第二次签名不对,那我们就自己再次签名一次,我的代码里面写了
以上就是微信支付的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。