Enregistrement complet du paiement Android WeChat sur le stand

Tout d'abord, laissez-moi en parler. La documentation de paiement WeChat et la démo fournie par WeChat sont vraiment horribles. Il a fallu beaucoup de temps pour enfin y parvenir. S'il y a toujours un problème, veuillez vérifier attentivement si le paramètre demandé est correct. Généralement, le nom d'un paramètre est omis.

1. La première étape consiste à obtenir les informations de signature MD5 de l'application

Écrivez la description de l'image ici
Si vous ne configurez pas l'environnement keytool, vous pouvez également utiliser l' accès direct aux informations fournies par les signatures de package micro-canal

2. Je ne mentionnerai pas le processus de candidature, veuillez faire attention, le nom du dossier de candidature et les informations relatives à la signature doivent être renseignés correctement. Au début, je me suis trompé dans les informations de signature et cela a pris du temps.

3. Une fois l'application terminée, commencez à accéder maintenant

dependencies {
   compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
  • Enregistrer APPID
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
public String getOderXml() {
       Map<String, String> oderMap = new HashMap<>();
       oderMap.put("appid", appid); //
       oderMap.put("mch_id", mch_id);//
       oderMap.put("device_info", device_info);//-
       oderMap.put("nonce_str", nonce_str);//
       oderMap.put("trade_type", trade_type);
       oderMap.put("body", body);
       oderMap.put("detail", detail);
       oderMap.put("out_trade_no", out_trade_no);
       oderMap.put("total_fee", total_fee);
       oderMap.put("spbill_create_ip", spbill_create_ip);
       oderMap.put("time_start", time_start);
       oderMap.put("notify_url", notify_url);

       //拼接字符串加上key值,然后对sign进行md5解密,之后再转成大写
       //将集合M内非空参数值的参数按照参数名ASCII码从小到大排序
       StringBuilder sign = new StringBuilder();
       TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
           @Override
           public int compare(String lhs, String rhs) {
               int i = rhs.compareTo(lhs);
               if (i > 0) {
                   return -1;
               } else if (i < 0) {
                   return 1;
               } else {
                   return i;
               }
           }
       });
       set.addAll(oderMap.keySet());

       for (String str : set) {
           sign.append(str).append("=").append(oderMap.get(str)).append("&");
       }
       sign.append("key").append("=").append(WechatUtil.KEY);
       oderMap.put("sign", StringUtil.md5(sign.toString()).toUpperCase());

       //拼接成xml格式的字符串
       StringBuilder stringBuilder = new StringBuilder();
       stringBuilder.append("<xml>");
       set.clear();
       set.addAll(oderMap.keySet());
       for (String s : set) {
           stringBuilder.append("<").append(s).append(">");
           stringBuilder.append(oderMap.get(s));
           stringBuilder.append("</").append(s).append(">");
       }
       stringBuilder.append("</xml>");
       return stringBuilder.toString();
   }
//处理微信返回的xml数据
public OderResult xmlToResult(String xml) {
       XmlPullParser pullParser = Xml.newPullParser();
       InputStream ins = new ByteArrayInputStream(xml.getBytes());
       OderResult result = new OderResult();
       try {
           pullParser.setInput(ins, "utf-8");
           int eventType = pullParser.getEventType();
           while (XmlPullParser.END_DOCUMENT != eventType) {
               switch (eventType) {
                   case XmlPullParser.START_TAG:
                       if ("return_code".equals(pullParser.getName())) {
                           result.setReturn_code(pullParser.nextText());
                       }
                       if ("return_msg".equals(pullParser.getName())) {
                           result.setReturn_msg(pullParser.nextText());
                       }
                       if ("appid".equals(pullParser.getName())) {
                           result.setAppid(pullParser.nextText());
                       }
                       if ("mch_id".equals(pullParser.getName())) {
                           result.setMch_id(pullParser.nextText());
                       }
                       if ("device_info".equals(pullParser.getName())) {
                           result.setDevice_info(pullParser.nextText());
                       }
                       if ("nonce_str".equals(pullParser.getName())) {
                           result.setNonce_str(pullParser.nextText());
                       }
                       if ("sign".equals(pullParser.getName())) {
                           result.setSign(pullParser.nextText());
                       }
                       if ("prepay_id".equals(pullParser.getName())) {
                           result.setPrepay_id(pullParser.nextText());
                       }
                       if ("trade_type".equals(pullParser.getName())) {
                           result.setTrade_type(pullParser.nextText());
                       }
                       if ("result_code".equals(pullParser.getName())) {
                           result.setResult_code(pullParser.nextText());
                       }
                       break;
                   case XmlPullParser.END_TAG:
                       break;
                   default:
                       break;
               }
               eventType = pullParser.next();
           }
       } catch (XmlPullParserException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
       return result;
   }
//随机字符串,不长于32位
   public String getRandom() {
       SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss", Locale.getDefault());
       Date date = new Date();
       String key = format.format(date);
       Random r = new Random();
       key = key + r.nextLong();
       key = StringUtil.md5(key);
       return key;
   }
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(request);
  • Le rappel du résultat du paiement, implémentez-en un .wxapi.WXPayEntryActivity(le nom de package ou le nom de classe incohérent rendra le rappel impossible). Si vous n'avez pas besoin d'afficher cela, terminez directement.
<activity
           android:name=".wxapi.WXPayEntryActivity"
           android:exported="true" />
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    
    
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, WechatUtil.APPID, false);
        api.handleIntent(getIntent(), this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onResp(BaseResp baseResp) {

        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (baseResp.errCode == BaseResp.ErrCode.ERR_COMM) {
                showToast("微信支付失败");
            } else if (baseResp.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
                showToast("用户取消");
            } else if (baseResp.errCode == BaseResp.ErrCode.ERR_OK) {
                showToast("微信支付成功");
            }
        }
    }
}
  • En cas d'échec, veuillez vérifier si les paramètres de l'appel de paiement sont corrects et que les paramètres de la signature sont corrects. Si cela ne fonctionne toujours pas, veuillez vérifier à nouveau. Il y a trop peu de messages d'erreur pour le paiement WeChat, uniquement succès et échec. Si la commande unifiée est réussie, alors il doit s'agir du paramètre que vous avez transféré au paiement est erroné, veuillez vérifier attentivement et répétez la chose importante trois fois.
  • S'il y a un problème lors de la passation d'une commande de manière unifiée, veuillez confirmer si le numéro de commande qui vous est retourné par le backend est unique, si les paramètres sont corrects, signez conformément aux exigences lors de la signature, si la plate-forme WeChat remplit le Signature MD5, et si la méthode de lancement de la demande Pour la publication, si les données XML sont transmises, si la demande est initiée à l'aide de Retrofit, cela peut être comme ceci:
new Retrofit.Builder()
             .baseUrl("https://api.mch.weixin.qq.com/pay/")
             .addConverterFactory(StringConverterFactory.create())
             .build()
             .create(API.class)
             .oder(RequestBody.create(MediaType.parse("text/plain"), oder)).enqueue(new Callback<String>() {
         @Override
         public void onResponse(Call<String> call, Response<String> response) {
             if (response.body() != null) {
                 OderResult result = xmlToResult(response.body());
                 if (result.getReturn_code().equals("SUCCESS")) {
                     if (result.getResult_code().equals("SUCCESS")) {

                     }
                 } else {

                 }
             }

         }

         @Override
         public void onFailure(Call<String> call, Throwable t) {

         }
     });
private interface API {
    
    
        @POST("unifiedorder")
        Call<String> oder(@Body RequestBody oder);
    }

Je suppose que tu aimes

Origine blog.csdn.net/Ser_Bad/article/details/68490947
conseillé
Classement