微信支付問題

微信支付走過的那些坑

  作爲一個大四的準畢業生,懵懂的我來到了人生的第一個公司,在開發過程中也遇到了各種各樣的問題,在這裏和大家分享一下

微信支付

  首先,去微信開放平臺下載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目錄下
這裏寫圖片描述

到此已經大功告成了,微信支付已經可以順利實現了。

下面附幾張圖片
這裏寫圖片描述
這裏寫圖片描述

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