微信支付问题

微信支付走过的那些坑

  作为一个大四的准毕业生,懵懂的我来到了人生的第一个公司,在开发过程中也遇到了各种各样的问题,在这里和大家分享一下

微信支付

  首先,去微信开放平台下载Android开发工具包、范例代码和签名生成工具
微信官方资源下载
这里写图片描述
 1.将Android开发工具包里jar文件下的mta-sdk-1.6.2.jar、open_sdk_r5756.jar和范例代码中libs文件夹下的libammsdk.jar放在Android Studio项目的lib文件夹下,并且选中右键Add as library…
 2.MainActivity.class代码如下:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.tencent.mm.sdk.modelpay.PayReq;
import com.tencent.mm.sdk.openapi.IWXAPI;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
    private IWXAPI iwxApi;
    private String string = "{'appid':'wxa123','partnerid':'123','prepayid':'wx123','noncestr':'wka123','timestamp':123,'package':'Sign=WXPay','sign':'123'}";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iwxApi = WXAPIFactory.createWXAPI(getActivity(), null);
        iwxApi.registerApp("APP ID");
        try {
            PayReq req = new PayReq();
            JSONObject json = new JSONObject(string);
            req.appId = json.getString("appid");
            req.nonceStr = json.getString("noncestr");
            req.packageValue = json.getString("package");
            req.partnerId = json.getString("partnerid");
            req.timeStamp = json.getString("timestamp");
            req.prepayId = json.getString("prepayid");
            req.sign = json.getString("sign");
            req.extData = "app data";
            if (!iwxApi.sendReq(req)) {
                Toast.makeText(MainActivity.this, "请安装微信", Toast.LENGTH_SHORT).show();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

注解:这里的string应该为请求网络后的json,通过PayReq类将字段进行封装(注意:此处的字段顺序不能乱,否则会支付会一直返回-1),最后通过sendReq()方法吊起微信支付。APP ID 处应该填写微信开发平台的APPID

   如果还想支付回调,则需要在项目包名下新建wxapi文件夹,放入WXPayEntryActivity.class文件(这两个名字都不能有一点错),代码如下:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, null);
        api.handleIntent(getIntent(), this);
    }
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }
    public void onReq(BaseReq req) {
    }
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            switch (resp.errCode) {
                case 0:
                    //成功
                    break;
                case -1:
                    //失败
                    break;
                case -2:
                    // 取消
                    break;
                default:
                    break;
            }
        }
    }
}

注解:该类中setContentView()可以直接删除,回调操作都在onResp中进行处理
还需要在AndroidManifest.xml中添加如下内容:

 <uses-permission android:name="android.permission.INTERNET" />
 <!-- 微信支付 -->
        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop" />
        <activity
            android:name="com.test.user.myapplication.MainActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="wxa791d98ecb40324b" />
            </intent-filter>
        </activity>            

   最后的重点来了,本人就在这栽了个大跟头
   将项目进行打包签名,不然是无法吊起微信支付的,点击微信支付后会一直闪屏。
打包签名如下:
1.点击Build选择Generate Signed APK…
这里写图片描述
2.如果没有keystore则创建一个新的keystore,点击Create New…
这里写图片描述
3.将信息填写完整点击OK即可。
这里写图片描述
4.勾选Remember passwords,点击Nest
这里写图片描述
5.输入步骤3中的密码,点击OK
这里写图片描述
6.点击finish即可,app-release.app在项目的app目录下
这里写图片描述

到此已经大功告成了,微信支付已经可以顺利实现了。

下面附几张图片
这里写图片描述
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章