1. 程式人生 > >android H5呼叫微信支付功能之坑慘了

android H5呼叫微信支付功能之坑慘了

一路過關一路坑,

1:微信開發平臺在建立應用時跟debug和release 包沒什麼關係,主要看的是包名、簽名、APP ID、商戶ID、金鑰、訂單號、隨機時間

msgApi = WXAPIFactory.createWXAPI(this, "APP ID");
msgApi.registerApp("APP ID"); 

2:介面返回或者H5攔截返回的URl時給出JSON格式或者給出Key=value格式都可以,然後自己在解析並新增到自己想要的資料中,上邊的Map中資料可以讓後臺去做,也是為了保證安全,不會被別人抓取,再就是put的資料時根據英文由A到Z依次排序的,如果第一位字母相同時比對第二位,

3: 如果sign是伺服器給返回的 && 返回格式是根據MD5把Map和商戶 金鑰拼接在一起加密的,這時候才是我們想去傳送給微信的資料格式,前提一定是key=value格式加密的。

public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters ,String key) {
    StringBuffer buffer = new StringBuffer();
Set es = parameters.entrySet();
Iterator iterator = es.iterator();
    while (iterator.hasNext()) {
        Map.Entry entry = (Map.Entry) iterator.next();
String k = (String) entry.getKey(); Object v = entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)){ buffer.append(k+"="+v+"&"); } } buffer.append("key="+key); String sign = ""; try { sign = MD5.getMD5
(buffer.toString()).toUpperCase(); } catch (Exception e) { e.printStackTrace(); } return sign; }

4:許可權

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

5:一定在外層wxapi 下新建WXPayEntryActivity 類,一定按照這格式寫,死要求,

msgApi.sendReq(req)這個方法時傳送給微信請求的,然後微信接受到請求結果正確的話就會喚起微信支付,如果錯誤返回-1code

-1code 錯誤要點:1:APP ID 與微信開發平臺不一致、2:商戶ID錯誤、3:在傳給微信資料時要根據英文字母排序、

                         4:sign 在拼接加密後錯誤,為按照key=value&key=商戶金鑰進行加密,主要在於鍵值對拼接錯誤


<activity
android:name=".wxapi.WXPayEntryActivity"
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="wxba9236aeb496354es"/> <!-- 可寫可不寫,前提是程式碼中為設定,-->
</intent-filter>
</activity>
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    public IWXAPI msgApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.ac_wxpay_entry);
msgApi = WXAPIFactory.createWXAPI(this, "APPID");
msgApi.registerApp("APPID");
msgApi.handleIntent(getIntent(), this);}
    @Override
protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
setIntent(intent);
msgApi.handleIntent(intent, this);
}

    @Override
public void onReq(BaseReq baseReq) {
    }

    @Override
public void onResp(BaseResp baseResp) {
        //0:成功、-1:失敗、-2:未支付返回
         //做自己想做的事情
        String wxBack = "";
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            wxBack = "ok";
} else {
            wxBack = "on";
}finish();
}}