android H5呼叫微信支付功能之坑慘了
阿新 • • 發佈:2019-02-05
一路過關一路坑,
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(); }}