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> 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:权限

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=商户密钥进行加密,主要在于键值对拼接错误

android H5调用微信支付功能之坑惨了_第1张图片

    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop">
    
        android:name="android.intent.action.VIEW"/>
        android:name="android.intent.category.DEFAULT"/>
        android:scheme="wxba9236aeb496354es"/> 
    
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();
    }
}













你可能感兴趣的:(android H5调用微信支付功能之坑惨了)