Android第三方微信支付教程

作者:lijiao 时间:2022-03-13 23:38:40 

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

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

二、分析一下微信支付的流程

Android第三方微信支付教程

三、界面交互流程

Android第三方微信支付教程

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

四、这里必须要有wxapi这个包名,同时必须有WXPayEntryActivity这个类名

Android第三方微信支付教程

五、在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.后台服务器是否按照要求第一次签名,第二次签名,如果第二次签名不对,那我们就自己再次签名一次,我的代码里面写了

标签:Android,第三方支付,微信支付
0
投稿

猜你喜欢

  • Java常用工具类库——Hutool的使用简介

    2022-09-27 18:24:45
  • C# 使用原生 System.IO.Compression 实现 zip 的压缩与解压

    2023-08-01 13:52:41
  • Hutool开发利器MapProxy类使用技巧详解

    2021-11-10 00:01:35
  • Java Lambda表达式与匿名内部类的联系和区别实例分析

    2022-01-05 21:10:22
  • C#延迟执行方法函数实例讲解

    2022-06-17 19:23:50
  • SpringBoot日志配置操作全面介绍

    2023-03-08 14:37:54
  • Android游戏开发实践之人物移动地图的平滑滚动处理

    2023-12-26 19:45:41
  • java数据结构与算法之冒泡排序详解

    2022-08-01 11:20:08
  • 详解java基础--提示对话框的使用

    2023-01-31 12:11:46
  • Android中Blade的使用方法

    2023-04-25 11:29:54
  • Java中的"goto"语句妙用

    2023-10-10 03:54:32
  • Mybatis 如何传入字符串参数,分割并遍历

    2021-10-08 01:14:45
  • android 添加按(power键)电源键结束通话(挂断电话)

    2023-08-14 20:38:24
  • Java框架解说之BIO NIO AIO不同IO模型演进之路

    2021-06-20 22:56:31
  • 深入剖析Android消息机制原理

    2023-09-30 01:57:11
  • android全局监控click事件的四种方式(小结)

    2023-05-02 07:33:31
  • Java用递归方法解决汉诺塔问题详解

    2022-11-23 03:11:40
  • SpringBoot实现本地文件存储及预览过程

    2022-07-31 05:30:58
  • C++实现图书馆管理系统源码

    2022-05-19 14:30:02
  • C# web.config之<customErrors>节点说明案例详解

    2023-07-06 20:20:15
  • asp之家 软件编程 m.aspxhome.com