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(); } }